Sql-Server

為什麼 CASE 語句中的 JSON_QUERY 無法刪除轉義字元?

  • May 21, 2019

如果在語句中應用該函式,則似乎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)

返回 nvarchar(max) 類型的 JSON 片段。

JSON_QUERY 返回一個有效的 JSON 片段。因此,FOR JSON 不會轉義 JSON_QUERY 返回值中的特殊字元。

所以for json path轉義nvarchar(max)數據,除非nvarchar(max)數據來自json_query().

在您的查詢中,數據來自 case 語句,而不是直接來自json_query.

您可以做的解決方法是放在json_query機箱外。

json_query(case when @debug = 1 then @data else null end)

將其合併到您的完整腳本中,以便您可以比較不同的方法,給出:

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', 
   json_query(case when @debug = 1 then @data else null end) as 'caseResultProcessed'
   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', -- This was the issue
   json_query(case when @debug = 1 then @data else null end) as 'caseResultProcessed' -- This is the solution
   for json path, without_array_wrapper ;

引用自:https://dba.stackexchange.com/questions/238186