Когда вы говорите, что ваше утверждение "... всегда помещает результаты в строку." , вы, вероятно, имеете в виду, что когда JSON
хранится в текстовом столбце, FOR JSON
экранирует этот текст.Конечно, если вы хотите вернуть неэкранированный текст JSON
, вам нужно использовать функцию JSON_QUERY
только для вашего действительного текста JSON
.
Далее следует небольшой обходной путь (основанный на FOR JSON
иманипуляции со строками), которые могут помочь решить вашу проблему.
Таблица:
CREATE TABLE #Data (
Arguments nvarchar(max)
)
INSERT INTO #Data
(Arguments)
VALUES
('{"a": "b"}'),
('Some text'),
('{"c": "d"}'),
('{"e": "f"}'),
('More[]text')
Заявление:
SELECT CONCAT(N'[', j1.JsonOutput, N',', j2.JsonOutput, N']')
FROM
(
SELECT JSON_QUERY(Arguments) AS Results
FROM #Data
WHERE ISJSON(Arguments) = 1
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) j1 (JsonOutput),
(
SELECT STRING_ESCAPE(ISNULL(Arguments, ''), 'json') AS Results
FROM #Data
WHERE ISJSON(Arguments) = 0
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) j2 (JsonOutput)
Вывод:
[{"Results":{"a": "b"}},{"Results":{"c": "d"}},{"Results":{"e": "f"}},{"Results":"Some text"},{"Results":"More[]text"}]
Примечания:
Один из недостатков заключается в том, что порядок элементов в сгенерированном выводе не такой, как в таблице.