T-Sql
為 JSON 正確轉義字元串中的字元
在下面的範例中,如何轉義 @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\\