T-Sql

為 JSON 正確轉義字元串中的字元

  • May 28, 2019

在下面的範例中,如何轉義 @data 變數中的雙引號字元?

declare @data nvarchar(max) = N'"TEST"';
declare @jsonFragment nvarchar(max);
declare @id int = 999;

set @jsonFragment = ',"' + cast(@id as nvarchar(16)) + '":"' + @data + '"';

select @jsonFragment;

結果是:

,"999":""TEST""

我需要它是:

,"999":"\"TEST\""

據我了解,選擇for json path需要我定義一個靜態鍵名 - 但可以看出,我有一個動態定義鍵名的場景。

在我的實際案例中,此字元串構造發生在stuff語句中,它本身是使用 CTE 的較大列定義的一部分select- 這意味著很難創建動態 sql 語句以使用sp_executeSQL.

為此目的,有一個稱為STRING_ESCAPE的系統函式,它將根據給定字元串類型的需要對字元進行轉義。

在您的範例中:

declare @data nvarchar(max) = N'"TEST"';
declare @jsonFragment nvarchar(max);
declare @id int = 999;

set @jsonFragment = ',"' + cast(@id as nvarchar(16)) + '":"' + STRING_ESCAPE(@data, 'json') + '"';

select @jsonFragment;

回報:

,"999":"\"TEST\""

它適用於所有需要轉義的元素,例如路徑名中的斜杠,例如:

SELECT STRING_ESCAPE(N'C:\PathName\Temp\', 'json')

退貨

C:\\PathName\\Temp\\

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