我有值为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'"]'));