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

时间:2018-11-02 13:48:48

标签: c# .net sql-server

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

@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#之间的结果不一致?我该怎么做才能将JSON数据恢复为C#?

2 个答案:

答案 0 :(得分:0)

我通过更改解决了此问题

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

收件人:

SELECT @Stats = CAST((SELECT * FROM JsonStats FOR JSON AUTO) AS nvarchar(max))

(明确转换为nvarchar(max))。

答案 1 :(得分:0)

您必须像这样设置outputParam的大小:

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