Использование MSFT SQL сервера XML, как вставить атрибуты в теги со значениями атрибутов, найденными в списке - PullRequest
0 голосов
/ 09 мая 2018

Я хочу добавить новый атрибут ко всем элементам, для которых в списке имен найдено значение @Name.

Это то, что у меня так далеко; это работает, но обновляет только один узел за раз. Я должен изменить значение «PatientNames» для каждого случая, который мне нужно обновить.

update ListDataFormatter_Test
SET FieldDefinition.modify('
   insert attribute PlainTextPersonNotification {"True"}
   into (/Fields/Field[@Name="PatientNames"])[1]
   ')

Я бы хотел, чтобы он мог обновляться с помощью одной команды, основанной на списке, подобном предложению 'IN' в стандартном SQL.

update ListDataFormatter_Test
SET FieldDefinition.modify('
  insert attribute PlainTextPersonNotification {"True"}
  into (/Fields/Field[@Name in ("PatientNames", "ProviderNames", "PracticeSettingsName", "PracticeSettingsMainAddresses", "PracticeSettingsPhones")])[1]')

FieldDefinition - это XML, и пример того, как это выглядит, выглядит следующим образом:

<Fields>
  <CalledDataFormatter Uid="9D7520C3-B507-463F-9CFD-18BDE5A74677" Prefix="PrimaryCare" />
  <Field Name="PatientNames" Layout="Name" />
  <Field Name="PatientPrimaryAddresses" Layout="Address" />
  <Field Name="PatientSecondaryAddresses" Layout="Address" />
  <Field Name="PatientDOB" Layout="Date" />
  <Field Name="PracticeSettingsName" Layout="Date" />

Я получаю правильные результаты, но мне нужно создать отдельную команду обновления для каждого значения @Name, которое я хочу изменить.

<Fields>
  <CalledDataFormatter Uid="9D7520C3-B507-463F-9CFD-18BDE5A74677" Prefix="PrimaryCare" />
  <Field Name="PatientNames" PlainTextPersonNotification="True" Layout="Name" />
  <Field Name="PatientPrimaryAddresses" Layout="Address" />
  <Field Name="PatientSecondaryAddresses" Layout="Address" />
  <Field Name="PatientDOB" Layout="Date" />
  <Field Name="PracticeSettingsName" PlainTextPersonNotification="True" Layout="Date" />

Мой список значений @Name теперь невелик, но с каждым собранием он растет.

1 Ответ

0 голосов
/ 06 июня 2018

Этот вопрос немного старше, но вам все еще может понадобиться решение. Вот FLWOR для вашего спасения :

DECLARE @tbl TABLE(ID INT IDENTITY, FieldDefinition XML);
INSERT INTO @tbl VALUES
 ( '<Fields>
      <CalledDataFormatter Uid="9D7520C3-B507-463F-9CFD-18BDE5A74677" Prefix="PrimaryCare" />
      <Field Name="PatientNames" Layout="Name" />
      <Field Name="PatientPrimaryAddresses" Layout="Address" />
      <Field Name="PatientSecondaryAddresses" Layout="Address" />
      <Field Name="PatientDOB" Layout="Date" />
      <Field Name="PracticeSettingsName" Layout="Date" />
    </Fields>');

- объявить список @Name значений

  DECLARE @ListOfNames VARCHAR(100)='PatientNames ProviderNames PracticeSettingsName PracticeSettingsMainAddresses PracticeSettingsPhones';

- Используйте FLWOR для манипулирования вашим XML

  SELECT FieldDefinition.query(
  N'
    <Fields>
    {
        for $nd in /Fields/*
        return 
        if(local-name($nd)="Field" and contains(sql:variable("@ListOfNames"),$nd/@Name)) then
            <Field PlainTextPersonNotification="True" >{$nd/@*}</Field>
        else
            $nd
    }
    </Fields>
  ')  
  FROM @tbl; 

Результат

<Fields>
  <CalledDataFormatter Uid="9D7520C3-B507-463F-9CFD-18BDE5A74677" Prefix="PrimaryCare" />
  <Field PlainTextPersonNotification="True" Name="PatientNames" Layout="Name" />
  <Field Name="PatientPrimaryAddresses" Layout="Address" />
  <Field Name="PatientSecondaryAddresses" Layout="Address" />
  <Field Name="PatientDOB" Layout="Date" />
  <Field PlainTextPersonNotification="True" Name="PracticeSettingsName" Layout="Date" />
</Fields>

Краткое объяснение

Вы можете использовать FLWOR для перестройки вашего XML. Начнем с жесткого кода <Fields>. Мы используем итерацию для всех элементов ниже <Fields>.
Если их local-name() равно Field, а объявленный список имен содержит значение @Name, мы создаем новый элемент <Field> с атрибутом need и добавляем все ранее существовавшие атрибуты. В противном случае мы возвращаем элемент без изменений.

...