使用JSON_MODIFY追加到空白列失败,并显示错误"Unexpected character '.' is found at position 0"



我有一个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_MODIFYappend无法处理空值。相反,您可以使用默认值[]作为空数组,它是完全有效的JSON。

请注意,ISNULL也不是必需的,因为CHECK约束将通过检查返回NULL,如文档中所述。

db<gt;小提琴

相关内容

最新更新