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 ']'
それに対する私の最大の批判は、めちゃくちゃ遅いということです。
現在、約 42,000 行で約 3:30 かかります。
私のもう 1 つの大きな批判は、現在、数値のように見えるものはすべて数値であると想定しているということです。少なくとも列の型を発見しようとはしません (それができるかどうかさえわかりません)。
最後のマイナーな批判は、最初のデータ行の前にコンマがあり、技術的にはそうすべきではないということです。これを補うために、JSON 配列を開始する最初の行に空の JSON オブジェクトが必要です。
他の批評 (できれば解決策を伴う) が招待されましたが、私が持っている唯一の本当の制限は、列名を明示的に識別する必要なく、多くの任意の SQL クエリで解決策が適切に再現可能であることです。
SQL Server 2012 を使用しています。
一般化された SQL 結果 -> JSON 配列コンバーターを探していた私のような他の人に感謝します。お楽しみください!