我有一个包含列ID
和列XMLData
的表格。不幸的是,XML数据列当前没有对XML本身内部的ID的任何引用,所以如果我只导出该列并解析它,我将无法将其绑定回ID。
我正在尝试向XML添加类似于以下内容的节点:
<AddedNode>
<Id>10862832</Id>
</AddedNode>
允许从XML本身解析ID,并将其连接回来。我尝试通过以下方法添加数据:
With Test_CTE (Id, XMLData, AddedXML)
As
(
select Id, XMLData, cast('<AddedNode>
<Id>' + cast(Id as varchar(20)) + '</Id>
</AddedNode>' as varchar(max)) as AddedXML
from dbo.TestTable
)
update T
set XMLData.modify('insert ' + CTE.AddedXML + '
as last into (/RootNode[1])
')
from dbo.TestTable T
inner join Test_CTE CTE on CTE.Id = T.Id
但是我收到错误“XML数据类型方法的参数1”修改“必须是字符串文字”。
我确定这与我试图通过一列数据拉出插入节点有关,但有人能告诉我如何修复它吗?
注意:我意识到我也可以通过使用变量在整个表上使用while循环来完成此操作,但表中有大约250万行,并且需要的时间比我想要的长。
答案 0 :(得分:1)
如果我能正确理解,可以更容易地做到这一点:
DECLARE @testtable TABLE(ID INT IDENTITY, XMLData XML);
INSERT INTO @testtable VALUES('<root><a>test</a></root>')
,('<root><a>test</a><b>Some other</b></root>');
UPDATE @testtable SET XMLData.modify(N'insert <AddedNode><Id>{sql:column("ID")}</Id></AddedNode> as first into (/root)[1]');
SELECT * FROM @testtable;
结果
ID XMLData
1 <root>
<AddedNode>
<Id>1</Id>
</AddedNode>
<a>test</a>
</root>
2 <root>
<AddedNode>
<Id>2</Id>
</AddedNode>
<a>test</a>
<b>Some other</b>
</root>
您自己的方法可能会更正(从不通过字符串连接构建XML!):
WITH Test_CTE AS
(
SELECT XMLData
,(SELECT ID AS [Id] FOR XML PATH('AddedNode'),TYPE) as AddedXML
FROM dbo.TestTable
)
UPDATE Test_CTE SET XMLData.modify(N'insert sql:column("AddedXML") as first into (/root)[1]');
SELECT * FROM dbo.TestTable;