我有一个SQL Server表,其中有一个默认为空字符串的NVARCHAR(MAX) NOT NULL
列。如果内容不是null或空字符串,则检查约束检查内容是否为有效的JSON:
CHECK ((ISNULL(ISJSON(NULLIF([MyJSONColumn],'')), (1)) = (1)
如果列已经包含一些JSON,例如,以下内容:
["This is some original stuff"]
那么我可以使用CCD_ 2来对其进行附加。
例如,这是有效的:
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
来设置初始值吗?我试着把";松懈";修饰符,但我仍然得到错误(即"appendlax$"(。
我建议更改列的默认值,因为空字符串不是有效的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;
附言:你作为价值的一部分传递的双引号变成了转义符;如果您不需要,请将它们从传入值中删除,如我的示例所示。
问题是您的约束是错误的
''
空字符串只是不是有效的JSON,但由于NULLIF
,约束允许它。限制应为
CHECK (ISJSON([MyJSONColumn]) = (1))
则CCD_ 10将不被允许。
您可能遇到的唯一问题是JSON_MODIFY
append
无法处理空值。相反,您可以使用默认值[]
作为空数组,它是完全有效的JSON。
请注意,ISNULL
也不是必需的,因为CHECK
约束将通过检查返回NULL
,如文档中所述。
db<gt;小提琴