FOR JSON PATH 导致 SSMS 被截断为 2033 个字符

צח *_*ורי 9 t-sql sql-server ssms

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

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

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

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

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

Bar*_* G. 12

插入 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
Run Code Online (Sandbox Code Playgroud)

或者

DECLARE @JSON nvarchar(max)
SET @JSON = (SELECT * FROM Table FOR JSON AUTO)
SELECT @JSON
Run Code Online (Sandbox Code Playgroud)


Raz*_*col 9

该行为记录在此处

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

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

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

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

尝试改用 FOR XML。例如:

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

  • 但OP专门要求JSON (3认同)

Luk*_*der 8

我注意到只需将 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
)
Run Code Online (Sandbox Code Playgroud)

...至少在较新版本的 SQL Server 中,例如 2019。dbfiddle演示在这里


She*_*onZ 5

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

SELECT CAST((SELECT [Columns] FROM [Tables] FOR JSON PATH('')) AS VARCHAR(MAX)) AS JSONDATA
Run Code Online (Sandbox Code Playgroud)