Parece que json_query
falha ao remover caracteres de escape para o caractere de aspas duplas ("") se a função estiver sendo aplicada em uma case
instrução.
Código de exemplo abaixo.
declare @data nvarchar(max);
declare @debug int = 0;
set @data = '{"id":10}';
set @debug = 0;
select
isjson(@data) as 'validateData',
@data as 'unprocessedSourceData',
json_query(@data) as 'processedSourceData',
case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData'
for json path, without_array_wrapper ;
set @debug = 1;
select
isjson(@data) as 'validateData',
@data as 'unprocessedSourceData',
json_query(@data) as 'processedSourceData',
case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData'
for json path, without_array_wrapper ;
Resultado da primeira consulta:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10}}
Resultado da segunda consulta:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10},"conditionallyProcessedSourceData":"{\"id\":10}"}
Observe os caracteres de escape no final : " {\"id\":10}
"
1) Por que seria assim?
2) Como faço para retrabalhar essa consulta para que, se @debug = 1
então o conditionallyProcessedSourceData
elemento contiver JSON válido, e se @debug = 0
o elemento for null
?
De JSON_QUERY (Transact-SQL)
e
Então
for json path
escapanvarchar(max)
dados, a menos que osnvarchar(max)
dados venham dejson_query()
.Em sua consulta, os dados vêm da instrução case e não diretamente de
json_query
.A solução alternativa que você pode fazer é colocar
json_query
fora do gabinete.Incorporar isso em seu script completo, para que você possa comparar as diferentes abordagens, fornece: