在存储过程中,我声明了一个名为@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#?
答案 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)