C#调用SQL Server存储过程返回JSON结果被截断至2033字符的问题求助
C#调用SQL Server存储过程返回JSON结果被截断至2033字符的问题求助
嗨,我之前也碰到过几乎一模一样的坑!这个2033字符的截断点其实是ExecuteScalar()方法的默认限制——当存储过程返回的是NVARCHAR类型且没明确指定长度时,SqlClient会默认按2033字符的长度来读取返回值,刚好就是你碰到的情况。
下面给你两个亲测有效的解决办法,选适合你的就行:
方法一:改用输出参数替代ExecuteScalar()
这个是我当时用的方案,直接又稳妥。你需要把存储过程的返回逻辑改成输出参数,同时在C#里明确指定输出参数的最大长度:
SqlCommand cmdPricing = new SqlCommand("Pricing.dbo.DEPAR_ALLOWED_JSON ", sqlServer); cmdPricing.CommandType = System.Data.CommandType.StoredProcedure; // 输入参数可以加上-1表示使用MAX长度,避免输入截断 cmdPricing.Parameters.Add("@claimsJSON", System.Data.SqlDbType.NVarChar, -1); cmdPricing.Parameters["@claimsJSON"].Value = requestJson; cmdPricing.Parameters.Add("@ReturnJSON", System.Data.SqlDbType.Bit); cmdPricing.Parameters["@ReturnJson"].Value = 1; // 新增输出参数,明确设置为NVARCHAR(MAX) var outputJsonParam = new SqlParameter("@ResultJSON", SqlDbType.NVarChar, -1) { Direction = ParameterDirection.Output }; cmdPricing.Parameters.Add(outputJsonParam); // 执行存储过程 cmdPricing.ExecuteNonQuery(); // 获取完整的结果 resultJson = outputJsonParam.Value.ToString();
记得同步修改你的存储过程,把原本要返回的JSON赋值给@ResultJSON这个输出参数,而不是用RETURN或者直接select返回。
方法二:用SqlDataReader读取完整结果(不用改存储过程)
要是你不想动存储过程的代码,也可以换用ExecuteReader()来读取结果,手动拼接完整字符串:
SqlCommand cmdPricing = new SqlCommand("Pricing.dbo.DEPAR_ALLOWED_JSON ", sqlServer); cmdPricing.CommandType = System.Data.CommandType.StoredProcedure; // 参数设置和你原来的一致 cmdPricing.Parameters.Add("@claimsJSON", System.Data.SqlDbType.NVarChar); cmdPricing.Parameters.Add("@ReturnJSON", System.Data.SqlDbType.Bit); cmdPricing.Parameters["@ReturnJson"].Value = 1; cmdPricing.Parameters["@claimsJSON"].Value = requestJson; StringBuilder fullResult = new StringBuilder(); using (SqlDataReader reader = cmdPricing.ExecuteReader()) { if (reader.Read()) { // 逐段读取直到结束,不会被默认长度限制 do { if (!reader.IsDBNull(0)) { fullResult.Append(reader.GetString(0)); } } while (reader.Read()); } } resultJson = fullResult.ToString();
这个方法的核心是SqlDataReader会完整读取所有返回的字符段,不会像ExecuteScalar()那样卡2033的默认限制。
为啥SSMS里就没问题?
因为SSMS会自动处理长字符串的读取逻辑,它不会套用SqlClient那种默认的长度限制,所以你能看到完整的JSON结果。
另外也可以确认下你的存储过程,确保返回的JSON是用NVARCHAR(MAX)类型返回的(不过既然SSMS里正常,大概率存储过程的类型是对的),主要问题还是出在C#的读取方式上。
你可以先试试第一种方法,我当时改完就直接解决问题了!




