TSQL 2005, XML DML - обновить два значения одновременно? - PullRequest
8 голосов
/ 07 сентября 2011

Есть ли способ объединить эти два значения замены с одним оператором обновления?

UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"')
WHERE id = 1

UPDATE dbo.MyTable
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"')
WHERE id = 1

http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

Не думаю, что вам повезло, Thx.

Я попробовал несколько синтаксических вариантов без радости.Например, очевидное:

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...')

выход:

Имя столбца 'MyXmlColumn' указывается более одного раза в предложении SET.Столбцу нельзя присвоить более одного значения в одном и том же предложении SET.Измените предложение SET, чтобы столбец обновлялся только один раз.Если предложение SET обновляет столбцы представления, тогда имя столбца «MyXmlColumn» может появляться дважды в определении представления.

Но для этого сообщения об ошибке в пространстве XML DML нет ничего полезного.

Суть в том, что Expression1 и Expression2 должны быть единичными элементами.

Даже самые подробные обсуждения заканчиваются циклом через него ...

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

Сожалею.: (

PS: Если вы можете терпеть хакерство, приведение к VARCHAR (MAX), тогда выполнение обычного REPLACE () должно помочь. См .: Могу ли я найти / заменить в t-SQL

2 голосов
/ 07 сентября 2011

Нет, как указано в документации, replace value of может работать только на одном узле одновременно.Насколько я знаю, для этого нет обходного пути.Вам нужно будет использовать 2 оператора обновления.

1 голос
/ 20 июля 2016

Если у вас есть пара значений, которые вы хотите изменить, вы можете использовать этот подход, который я нашел в sqlservercentral . Он использует оператор выбора, чтобы получить данные, манипулирует им несколько раз, и использует один оператор обновления, чтобы изменить данные таблицы.

Не идеально, но в некоторых случаях может быть достаточно. По сути, это упрощенная версия циклического решения для фиксированного числа изменяемых значений.

DECLARE @temp XML
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId)

SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")')

UPDATE Table_name
SET Column_name = @temp
WHERE AuthId = @AuthId
...