【问题标题】:FOR JSON PATH results in SSMS truncated to 2033 charactersFOR JSON PATH 导致 SSMS 被截断为 2033 个字符
【发布时间】:2019-07-25 04:37:21
【问题描述】:

我正在使用“for JSON path('')”将字符串连接在一起。

我已将 Tools->Options->SQL Server->Results to Grid 选项设置为最大。

我已将 Tools->Options->SQL Server->Results to Text 选项设置为最大。

在Grid模式下执行查询并复制一行/一列结果,我看到返回值限制为2033个字符。

如何确保返回的值不被截断?

【问题讨论】:

  • I'm concatenating strings together using "for JSON path - 为什么?如果您向我们提供更多关于问题是什么以及为什么您认为 for JSON path 非常合适的背景信息,也许我们可以解决您正在解决的问题。

标签: sql-server tsql ssms


【解决方案1】:

行为是documented here:

大型结果集将长 JSON 字符串拆分为多行。

默认情况下,当输出设置为“结果到网格”时,SQL Server Management Studio (SSMS) 会将结果连接到单行中。 SSMS 状态栏显示实际的行数。

其他客户端应用程序可能需要代码通过连接多行的内容将冗长的结果重新组合成一个有效的 JSON 字符串。有关 C# 应用程序中此代码的示例,请参阅Use FOR JSON output in a C# client app

因此,使用 FOR JSON 连接字符串(当结果长于 2033 字节时)并不是最好的主意。

尝试改用 FOR XML。例如:

SELECT STUFF((
    SELECT ', '+name FROM sys.columns FOR XML PATH(''), TYPE
).value('.','nvarchar(max)'),1,2,'')

【讨论】:

【解决方案2】:

插入到 nvarchar(max) 变量或表格中即可。

declare @json table (j nvarchar(max));
insert into @json select * from(select* from Table where Criteria1 for json auto)a(j)
insert into @json select * from(select* from Table where Criteria2 for json auto)a(j)
select * from @json

DECLARE @JSON nvarchar(max)
SET @JSON = (SELECT * FROM Table FOR JSON AUTO)
SELECT @JSON

【讨论】:

    【解决方案3】:

    我有类似的问题,并通过将转换结果转换为 varchar 格式找到了答案。请注意结果仍然有限制,因为 varchar 最多有 8000 个字符。但它适用于我的情况。希望能帮助到你。

    SELECT CAST((SELECT [Columns] FROM [Tables] FOR JSON PATH('')) AS VARCHAR(MAX)) AS JSONDATA
    

    【讨论】:

      【解决方案4】:

      我注意到只需将 JSON(或 XML)放入标量子查询就足够了:

      -- Useless
      select row_number() over(order by (select 1)) as rn
      from sys.all_objects
      for json auto
      
      -- Useful
      select (
        select row_number() over(order by (select 1)) as rn
        from sys.all_objects
        for json auto
      )
      

      ... 至少在较新版本的 SQL Server 中,例如2019.dbfiddle demo here

      【讨论】:

      【解决方案5】:

      我通过使用字符串生成器并在 DataReader 循环中附加额外的行来实现这一点。

      我的原始逻辑只允许返回单行 - 因此当数据读取器循环不止一次时 - 它陷入了 2033+ 长度问题。

      【讨论】:

        【解决方案6】:

        使用最新的 SSMS (18.8) 截断似乎没问题,只需单击网格视图中结果集上突出显示的输出,它就会在新文档中打开整个字符串。 See this screenshot

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-05
          • 1970-01-01
          • 2017-03-12
          • 1970-01-01
          相关资源
          最近更新 更多