SQL データベース (互換レベル 140) からキーと値のペア項目の JSON シリアル化リストを作成しようとしています。秘訣は、数値、文字列、null、またはその他の JSON オブジェクトなど、値は何でもかまいません。
次のようになります。
[{"key":"key1","value":"A String"},{"key":"key2","value":{"InnerKey":"InnerValue"}}]
ただし、SQL では、文字列またはオブジェクトのいずれかを選択するように強制されているようです。
SELECT
[key] = kvp.[key],
[value] = CASE
WHEN ISJSON(kvp.[value]) = 1 THEN JSON_QUERY(kvp.[value])
ELSE '"' + kvp.[value] + '"' -- See note below
END
FROM (VALUES
('key1', 'This value is a string')
,('key2', '{"description":"This value is an object"}')
,('key3', '["This","value","is","an","array","of","strings"]')
,('key4', NULL)
-- Without these lines, the above 4 work fine; with either of them, even those 4 are broken
--,('key5', (SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER))
--,('key6', JSON_QUERY((SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
) AS kvp([key], [value])
FOR JSON PATH
SQL がサポートできないことをしようとしているのですか、それともこれを機能させるための適切な構文が欠けているだけですか?
*二重引用符の追加は必要ないように思われることに注意してください。しかし、それらがないと、SQL は文字列のラップに失敗し、不適切な JSON を生成します。
[{"key":"key1","value":This value is a string},...