如果在语句中应用该函数,则似乎json_query
无法删除双引号字符 (") 的转义字符。case
下面的示例代码。
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 ;
第一个查询的结果:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10}}
第二个查询的结果:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10},"conditionallyProcessedSourceData":"{\"id\":10}"}
注意最后的转义字符:“ {\"id\":10}
”
1)为什么会这样?
2)我如何重新处理这个查询,以便如果@debug = 1
元素conditionallyProcessedSourceData
包含有效的 JSON,并且如果@debug = 0
元素是null
?
来自JSON_QUERY (Transact-SQL)
和
所以
for json path
转义nvarchar(max)
数据,除非nvarchar(max)
数据来自json_query()
.在您的查询中,数据来自 case 语句,而不是直接来自
json_query
.您可以做的解决方法是放在
json_query
机箱外。将其合并到您的完整脚本中,以便您可以比较不同的方法,给出: