我有一個 SQL Server 表,其中有一NVARCHAR(MAX) NOT NULL列默認為空字串。如果內容不是 null 或空字串,則檢查約束檢查內容是否是有效的 JSON:
CHECK ((ISNULL(ISJSON(NULLIF([MyJSONColumn],'')), (1)) = (1)
如果該列已包含一些 JSON,例如,以下內容:
["This is some original stuff"]
然后我可以使用JSON_MODIFY.
例如,這有效:
UPDATE t
SET t.MyJSONColumn = JSON_MODIFY(t.MyJSONColumn, 'append $', '"This is some appended stuff."')
FROM dbo.MyTable t
WHERE t.PrimaryKey = 1
如果我再從表中選擇:
SELECT MyJsonColumn
FROM dbo.MyTable
WHERE PrimaryKey = 1
我得到了附加的 JSON,如下所示:
["This is some original stuff","This is some appended stuff."]
一切都很好。但是,如果我在列為JSON_MODIFY空字串時嘗試完全相同的更新,則會收到此錯誤:
JSON 文本格式不正確。意外字符 '.' 在位置 0 處找到。
我最初可以設定空白值的唯一方法MyJSONColumn是做這樣的事情。這有效,但當然非常丑陋:
UPDATE t
SET t.MyJSONColumn = '["This is some stuff."]')
在列中獲得初始值后,我可以使用JSON_MODIFY附加到它。
我可以JSON_MODIFY用來設定那個初始值嗎?我已經嘗試添加“lax”修飾符,但我仍然收到錯誤訊息(即“append lax $”)。
uj5u.com熱心網友回復:
我建議更改列的默認值,因為空字串不是有效的 JSON。因此,當您將它作為第一個引數傳遞給JSON_MODIFY()函式時,它肯定會不同意。
根據您的需要,它可能是一個根陣列:
declare @s nvarchar(max) = '[]';
set @s = JSON_MODIFY(@s, 'append $', N'This is some appended stuff.');
select @s;
或更詳細(但可擴展)的結構:
declare @s nvarchar(max) = '{ "Values" : [] }';
set @s = JSON_MODIFY(@s, 'append $.Values', N'This is some appended stuff.');
select @s;
PS 作為值的一部分傳遞的雙引號被轉義了;如果您不需要它,請將它們從傳入值中洗掉,如我的示例所示。
uj5u.com熱心網友回復:
問題是你的約束是錯誤的。
''空字串根本不是有效的 JSON,但約束允許它,因為NULLIF. 約束應該是
CHECK (ISJSON([MyJSONColumn]) = (1))
然后''將不被允許。
您可能遇到的唯一問題是它JSON_MODIFY append不適用于空值。相反,您可以使用[]完全有效的 JSON的默認值作為空陣列。
請注意,這ISNULL也不是必需的,因為CHECK約束將通過NULL檢查回傳,如檔案中所述。
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361407.html
標籤:json sql-server
