经过大量搜索和拼凑使用 Web 上的 FOR XML 和 .nodes() 命令转换结果集的非常出色的技术后,我能够创建这个单一的查询(不是存储过程),它可以合理地执行将任意 SQL 查询转换为 JSON 数组的工作做得很好。
该查询会将每个数据行编码为带有前导逗号的单个 JSON 对象。数据行用括号括起来,然后整个结果集将被导出到一个文件中。
我想看看是否有人可以看到提高其性能的方法?
这是带有示例表的查询:
declare @xd table (col1 varchar(max), col2 int, col3 real, colNull int)
insert into @xd
select '', null, null, null
UNION ALL select 'ItemA', 123, 123.123, null
UNION ALL select 'ItemB', 456, 456.456, null
UNION ALL select '7890', 789, 789.789, null
select '[{}'
UNION ALL
select ',{' + STUFF((
(select ','
+ '"' + r.value('local-name(.)', 'varchar(max)') + '":'
+ case when r.value('./@xsi:nil', 'varchar(max)') = 'true' then 'null'
when isnumeric(r.value('.', 'varchar(max)')) = 1
then r.value('.', 'varchar(max)')
else '"' + r.value('.', 'varchar(max)') + '"'
end
from rows.nodes('/row/*') as x(r) for xml path(''))
), 1, 1, '') + '}'
from (
-- Arbitrary query goes here, (fields go where t.* is, table where @xd t is)
select (select t.* for xml raw,type,elements XSINIL) rows
from @xd t
) xd
UNION ALL
select ']'
我对它最大的批评是它非常缓慢。
目前大约需要 3:30 处理约 42,000 行。
我的另一个重大批评是,它目前假设所有看起来像数字的东西都是数字。它至少不会尝试发现列类型(我什至不确定它是否可以)。
最后一个小批评是第一个数据行前面会有一个逗号,从技术上讲它不应该。为了弥补这一点,它需要在启动 JSON 数组的第一行中使用空 JSON 对象。
邀请了其他批评(最好是解决方案),我唯一真正的限制是该解决方案在许多任意 SQL 查询上都可以很好地重复,而无需显式识别列名。
我正在使用 SQL Server 2012。
感谢并感谢像我这样正在寻找通用 SQL 结果-> JSON 数组转换器的其他人,享受吧!