使用XML列[T-SQL]中的不同值更新所有行

时间:2019-07-07 10:48:08

标签: sql sql-server xml

我想更新一列(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>

此导航必须唯一,其他行也必须唯一

1 个答案:

答案 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以任何方式取决于您的主表),则该关联就足够了。