SQL Server存储过程的JSON字符串输出参数在SSMS中工作,但在C#client中产生空值

SQL Server存储过程的JSON字符串输出参数在SSMS中工作,但在C#client中产生空值,c#,.net,sql-server,C#,.net,Sql Server,在我的存储过程中,我声明了一个名为@Stats的输出参数: @Stats nvarchar(max) OUTPUT 在存储过程结束时,我将JSON查询的结果分配给输出参数: SELECT @Stats = (SELECT * FROM JsonStats FOR JSON AUTO) 如果我在SSMS中执行存储过程,我将按预期从@Stats获取JSON数据: DECLARE @Param1 nvarchar(max) = '...' DECLARE @Stats nvarchar(max)

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

@Stats nvarchar(max) OUTPUT
在存储过程结束时,我将JSON查询的结果分配给输出参数:

SELECT @Stats = (SELECT * FROM JsonStats FOR JSON AUTO)
如果我在SSMS中执行存储过程,我将按预期从
@Stats
获取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数据?

我通过更改

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


(显式转换为
nvarchar(max)
)。

您必须设置
输出参数的大小,如下所示:

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

不确定是否是这样,但在将
CommandType
设置为
StoredProcedure
时,不需要包含
EXEC
语句。实际上,将代码粘贴到此处是一个错误-该值来自一个变量,因此为了清晰起见,我添加了字符串文字。实际代码不包括“EXEC”,我已经更新了问题以反映这一点。谢谢@Param1?nvarchar(最大值)的类型是什么。我已经更新了这个问题。您没有传递@Param1的长度,这就是为什么SQL会截断您的输入,而您不会得到正确的结果。
var outputParam = new SqlParameter("@Stats", SqlDbType.NVarChar, 100000)