Мне не удалось найти никакой документации, можно ли динамически вставить узел xml в существующий экземпляр xml в SQL Server (2012). Я знаю, что вы можете вставить или заменить условное значение, но, похоже, нет никакой документации, если место вставки может быть выполнено динамически на основе некоторых условий. Например, скажем, у меня есть этот вызов XML-DML:
SET @xml.modify('insert <SecondaryContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></SecondaryContact>
after (/Project/PrimaryContact)[1]');
Будет ли модификация, в которой узел, указанный после ключевого слова after
, является условным, допустимым синтаксисом? Ниже приводится пример того, что я имею в виду:
SET @xml.modify('insert <TechnicalContact><Name>{ sql:variable("@contactName") }</Name>
<Phone>{ sql:variable("@contactPhone") }</Phone>
<Email>{ sql:variable("@contactEmail") }</Email></TechnicalContact>
after (
if(count(/Project/SecondaryContact) = 0)
then (/Project/PrimaryContact)[1]
else (/Project/SecondaryContact)(1)
)');
Это единственный способ динамически выбрать место для IF..ELSE
операторов вне операторов XML DML, или мой пример XML-DML действителен?
ИЗМЕНИТЬ Пример XML:
<root>
...
<PrimaryContact Id="1234">
<Name>John Doe</Name>
<Phone>555-555-5555</Phone>
<Email>[email protected]</Email>
</PrimaryContact>
<SecondaryContact Id="1236"> <--OPTIONAL
<Name>John Doe1</Name>
<Phone>555-555-5556</Phone>
<Email>[email protected]</Email>
</SecondaryContact>
<TechnicalContact Id="2234"> <--OPTIONAL
<Name>John Doe2</Name>
<Phone>555-555-5255</Phone>
<Email>[email protected]</Email>
</TechnicalContact>
...
</root>
Я понимаю, что структура не идеальна. Это должно быть <Contacts><Contact Type="PRIMARY" Id="1234">...</Contact>...</Contacts>
, но хотелось посмотреть, возможно ли место динамической вставки в операторе DML. Использование курсора подходит для этого вопроса, как и для одноразового обновления.
.modify()
очень ограничен ... Это может быть довольно просто сFLWOR-query()
, что-то вроде _3 _... Но это зависит от ваших реальных потребностей ... Вы проверили мой ответ? - person Shnugo   schedule 04.11.2016<PrimaryContact>
и<TechnicalContact>
, если вторичный не существует и теперь необходим. (Я знаю, что не дал этого ясно в вопросе!) - person JNYRanger   schedule 04.11.2016.query()
для получения всех незатронутых узлов,.value()
для извлечения затронутых значений. Затем используйте простой операторSELECT ... FOR XML PATH()
, чтобы перестроить свой XML так, как вам нужно ... - person Shnugo   schedule 04.11.2016