无键的Sql服务器列序列化



我有值为hello的列A

我需要将它迁移到值为["hello"]的新列AJson中。

我必须使用Sql Server命令来执行此操作。

有不同的命令FOR JSON等,但它们用列名序列化值。

这与C#方法JsonConvert.SerializeObject(new List<string>(){"hello"}序列化结果的值相同。

我不能简单地在开头和结尾附加[",因为字符串值可能包含一些字符,如果没有正确的序列化,这些字符将破坏json字符串。

我的建议是,只需进行大量嵌套替换,然后自己进行。

FOR JSON用于整个JSON,因此在没有键的情况下无效。

下面是一个简单的例子,用替换结束行

print replace('ab
c','
','n')

要替换为\b的Backspace。

表单馈送将替换为\f。

要替换为\n的换行符。

将回车替换为\r。

要替换为\t的选项卡。

双引号替换为";

要替换为\的后间隙

我的方法是使用以下3个命令:

UPDATE Offers
SET [DetailsJson] =
(SELECT TOP 1 [Details] AS A
FROM Offers AS B
WHERE B.Id = Offers.Id
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
UPDATE Offers
SET [DetailsJson] = Substring([DetailsJson], 6, LEN([DetailsJson]) - 6)
UPDATE Offers
SET [DetailsJson] = '['  + [DetailsJson] + ']'

。。对于op的答案/表格。。

UPDATE Offers
SET [DetailsJson] = concat(N'["', string_escape([Details], 'json'), N'"]');

declare @col nvarchar(100) = N'
a b c " : [ ] ]
x
y
z'

select  concat(N'["', string_escape(@col, 'json'), N'"]'), isjson(concat(N'["', string_escape(@col, 'json'), N'"]'));

最新更新