我想更新一列(ColumnToUpdate),它是XML类型并且存在于一个表(SomeTable)中。我想将包含新GUID列表的XML放入每一行。
我知道如何更新XML插入XML,但是我不知道如何为每一行创建新的GUID。当我将GUID分配给T-SQL中的某个变量->时,由于不起作用,它将是相同的值。
p
之前
UPDATE SomeTable
SET ColumnToUpdate.modify('insert
<SomeTag>,
<ID Value=sql:variable(NEWID())/ID>,
<SomeOtherTag>MySpecificValue1</SomeOtherTag>,
<Tag3>True</Tag>,
</SomeTag>,
<SomeTag>
<ID Value=sql:variable(NEWID())/ID>,
<SomeOtherTag>MySpecificValueTotallyDiffrent</SomeOtherTag>,
<Tag3>False</Tag>,
</SomeTag>
<SomeTag>
<ID Value=sql:variable(NEWID())/ID>,
<SomeOtherTag>SomeOtherName</SomeOtherTag>,
<Tag3>False</Tag>,
</SomeTag>
<SomeTag>
<ID Value=sql:variable(NEWID())/ID>,
<SomeOtherTag>SomeOtherOtherName</SomeOtherTag>
<Tag3>False</Tag>
</SomeTag>
(/SomeParentTag/childTag)[1]')
之后
<someParentTag>
</childTag>
</someParentTag>
此导航必须唯一,其他行也必须唯一
答案 0 :(得分:1)
您可以使用另一个表来生成所需数量的节点并将其插入。这是一个示例:
declare @t table (
Id int identity(1,1) primary key,
XMLData xml
);
insert into @t (XMLData)
values ('<someParentTag>
<childTag/>
</someParentTag>'),
('<someParentTag>
<childTag/>
</someParentTag>');
declare @extradata table (
SomeOtherColumn varchar(100),
Column3 varchar(10)
);
-- Your data should come from somewhere, right?
insert into @extradata (SomeOtherColumn, Column3)
values
('MySpecificValue1', 'True'),
('MySpecificValueTotallyDiffrent', 'False'),
('SomeOtherName', 'False'),
('SomeOtherOtherName', 'False');
-- Before
select * from @t;
update t set XMLData.modify('insert sql:column("n.a") into (/someParentTag/childTag)[1]')
from @t t
cross apply (
select newid() as [ID/@Value], xd.SomeOtherColumn as [SomeOtherTag],
xd.Column3 as [Tag3]
from @extradata xd
-- Artificial correlation to prevent result caching
inner join @t tc on 1=1
where tc.Id = t.Id
for xml path('SomeTag'), type
) n(a);
-- After
select * from @t;
子查询中的关联是人为的,在此示例中没有任何意义,但是似乎有必要防止SQL Server节省一些工作并为其中的所有行重新使用相同的XML片段修改后的表。如果在您的实际情况下,您已经具有某种关联(例如,生成的XML以任何方式取决于您的主表),则该关联就足够了。