SQL Server截断作为JSON返回的数据

Uri*_*iil 8 c# sql t-sql sql-server azure-sql-database

问题是,如果SQL返回超过2033个字符的JSON,它会被截断,但如果我在SQL端将其转换为NVARCHAR(max),结果将不会被截断,一切都会好的.

有趣的是,在SSMS中我有类似的行为,当我复制JSON返回为字符串时,它复制整个对象,但是如果我复制JSON的值作为JSON返回它会在N个字符后被截断.但是如果我点击JSON作为JSON结果它将打开完整对象.

有什么想法来解释这种行为?

代码,读取数据(虽然我在这里使用dapper,结果与SqlCommand和ExecuteScalar/Reader相同):

using (var connection = new SqlConnection(_connectionString))
{
    var response = await connection.ExecuteScalarAsync<string>($"[Portal].[GetData]", commandType: CommandType.StoredProcedure);
    return response == null ? null : JObject.Parse(response);
}
Run Code Online (Sandbox Code Playgroud)

过程,返回.NET可以正确解析的结果:

   CREATE PROCEDURE [Portal].[GetData] 
   AS
   BEGIN
    SET NOCOUNT ON;

    DECLARE @result NVARCHAR(max);
    SET @result = (SELECT TOP (120) 
        [DateTime]
        ,[Open]
        ,[Closed]
        ,[Total]
    FROM [Common].[Table]
        FOR JSON PATH, ROOT('Root'))
    SELECT @result;
   END 
Run Code Online (Sandbox Code Playgroud)

SSMS中的结果视图(结果不可点击,但可以复制而不截断):

以字符串形式返回

过程,返回截断的结果(结果不可点击):

   CREATE PROCEDURE [Portal].[GetData] 
   AS
   BEGIN
    SET NOCOUNT ON;

    SELECT TOP (120) 
        [DateTime]
        ,[Open]
        ,[Closed]
        ,[Total]
    FROM [Common].[Table]
        FOR JSON PATH, ROOT('Root')
   END 
Run Code Online (Sandbox Code Playgroud)

SSMS中的结果视图:

以JSON身份返回