Обновить все строки с разными значениями в столбце XML [T-SQL] - PullRequest
0 голосов
/ 07 июля 2019

Я хотел бы обновить столбец (ColumnToUpdate), который является типом XML и существует в одной таблице (SomeTable).И я хотел бы поместить в каждую строку XML, содержащий список с новым GUID

. Я знаю, как обновить XML, вставляя XML, но я не знаю, как создать новый GUID для каждой строки.Когда я назначаю GUID какой-то переменной в T-SQL ->, то в нерабочем состоянии это будет то же значение.

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>

ПОСЛЕ

<someParentTag>
 <childTag>
  <SomeTag>
   <ID Value=GENERATED_NEW_GUID/>
   <SomeOtherTag>MySpecificValue1</SomeOtherTag>
   <Tag3>True</Tag>
  </SomeTag>
  <SomeTag>
   <ID Value=GENERATED_NEW_GUID1/>
   <SomeOtherTag>MySpecificValueTotallyDiffrent</SomeOtherTag>
   <Tag3>False</Tag>
  </SomeTag>
  <SomeTag>
   <ID Value=GENERATED_NEW_GUID3/>
   <SomeOtherTag>SomeOtherName</SomeOtherTag>
   <Tag3>Fasle</Tag3>
  </SomeTag>
  <SomeTag>
   <ID Value=GENERATED_NEW_GUID4/>
   <SomeOtherTag>SomeOtherOtherName</SomeOtherTag>
   <Tag3>Fasle</Tag3>
  </SomeTag>
</childTag>
</someParentTag>

Эти направляющие должны быть уникальными, а также должны быть уникальными для других рядов

1 Ответ

1 голос
/ 07 июля 2019

Вы можете использовать другую таблицу, чтобы сгенерировать желаемое количество узлов и вставить их.Вот пример:

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 каким-либо образом зависит от вашей основной таблицы), то этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...