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

时间:2019-03-03 20:42:09

标签: sql-server tsql ssms

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

我将“工具”->“选项”->“ SQL Server”->“结果到网格”选项设置为最大。

我已将“工具”->“选项”->“ SQL Server”->“结果为文本”选项设置为最大。

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

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

5 个答案:

答案 0 :(得分:4)

行为是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,'')

答案 1 :(得分:4)

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

#!/bin/bash
echo 1. date
date
echo -e "\n"
echo 2. hostname
hostname
echo -e "\n"
echo 3. arch
arch
echo -e "\n"
echo 4. uname -a
uname -a
echo -e "\n"
echo 5.uptime
uptime
echo -e "\n"
echo 6. whoami
whoami
echo -e "\n"
echo 7. who
who
echo -e "\n"
echo 8. last
last
echo -e "\n"
echo 9. finger
finger
echo -e "\n"
echo 10. w
w
echo -e "\n"
echo 11. top
top -n 1
echo -e "\n"
echo 12. history
tail -100 ${HOME}/.bash_history
echo -e "\n"
echo End of Script!

答案 2 :(得分:1)

插入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)
PRINT @JSON

答案 3 :(得分:1)

我注意到只需将 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

答案 4 :(得分:0)

我通过使用字符串生成器并在DataReader循环中附加其他行来使其工作。

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