首页 > 解决方案 > SQL Server 存储过程的 JSON 字符串输出参数在 SSMS 中有效,但在 C# 客户端中产生空值

问题描述

在我的存储过程中,我声明了一个名为的 OUTPUT 参数@Stats

@Stats nvarchar(max) OUTPUT

在存储过程结束时,我将 JSON 查询的结果分配给输出参数:

SELECT @Stats = (SELECT * FROM JsonStats FOR JSON AUTO)

@Stats如果我在 SSMS 中执行存储过程,我会按预期获取 JSON 数据:

DECLARE @Param1 nvarchar(max) = '...'
DECLARE @Stats nvarchar(max)

EXEC MySP @Param1, @Stats OUTPUT

SELECT @Stats

但是,当我从 C# 代码执行存储过程时,我得到一个空字符串:

SqlCommand cmd = new SqlCommand("MySP", conn)
        {
            CommandType = CommandType.StoredProcedure
        };

var inputParam = new SqlParameter("@Param1", invoiceKeyListJson);
cmd.Parameters.Add(inputParam);

var outputParam = new SqlParameter("@Stats", SqlDbType.NVarChar, -1);
outputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outputParam);

cmd.ExecuteNonQuery();

string statsJson = outputParam.Value.ToString();

运行上述代码后,statsJson为空。奇怪的是,如果我@Stats在存储过程中对任意字符串的赋值进行硬编码,statsJson就会被赋予该值。

为什么 SSMS 和 C# 之间的结果不一致?我需要做什么才能在 C# 中获取 JSON 数据?

标签: c#.netsql-server

解决方案


你必须设置你outputParam喜欢的大小:

var outputParam = new SqlParameter("@Stats", SqlDbType.NVarChar, 100000)

推荐阅读