TSQL 2005, XML DML-обновить сразу два значения?

есть ли способ объединить эти два значения replace с 1 инструкцией update?

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 ответов


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

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

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

выходы:

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

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

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

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

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

извините. :(

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


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


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

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

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