我正在使用“ for JSON path('')”将字符串串联在一起。
我将“工具”->“选项”->“ SQL Server”->“结果到网格”选项设置为最大。
我已将“工具”->“选项”->“ SQL Server”->“结果为文本”选项设置为最大。
以网格模式执行查询并复制一行/一列的结果,我看到返回值限制为2033个字符。
如何确保返回值不被截断?
答案 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+长度问题。