TSQL: Как обновить поле xml из значения из xml из другой таблицы? - PullRequest
1 голос
/ 27 ноября 2011

У меня есть две (как-то связанные) таблицы с полями XML. Проблема в том, что я должен обновить XML первого данными из XML второго. Более 100 записей. Как это сделать с помощью TSQL?

Я создал что-то вроде этого.

UPDATE [pwi_new].[dbo].[art]
SET rest.modify('
    replace value of (/root/e[k="alien_id"]/v[1]/text())[1]
    with sql:column("new.rest.value(
        ''(/root/e[k="alien_id"/v)[1]'',''varchar(max)'')
    ")
')
FROM art_new AS new WHERE
    (
        art.title = new.title
        OR art.id = 1352 AND new.id = 119
        OR art.id = 1353 AND new.id = 120
        OR art.id = 1379 AND new.id = 146
        OR art.id = 1380 AND new.id = 147
    )
    AND art.parent = 1460

Однако это не работает. У меня есть эта ошибка

XQuery [pwi_new.dbo.art.rest.modify ()]: ',' или ')' ожидается

в этой строке:

''(/root/e[k="alien_id"/v)[1]'',''varchar(max)'')

и понятия не имею, как исправить, если это возможно.


Похоже, это невозможно без подзапросов, cte, представлений и т. Д.


TSQL: Как обновить значение тега xml значением тега xml из другой связанной таблицы?
Я знаю этот вопрос. У меня есть более 100 записей, поэтому я хотел бы вариант, который не требует sql: variable

1 Ответ

3 голосов
/ 27 ноября 2011

Читая ссылку в вашем вопросе, я воспользовался этой идеей и изменил ваш начальный запрос, добавив CTE , чтобы убрать требование к sql: variable.

У меня нет ни одногоДанные XML, чтобы проверить это прямо сейчас, но что-то вроде этого должно работать (синтаксис будет близок, не слишком знаком с xquery)

WITH NewXmlData AS
(
   SELECT art.Id AS artId, new.Id AS newId
      , new.rest.value( '(/root/e[k="alien_id"/v)[1]','VARCHAR(MAX)' AS newValue
   FROM [pwi_new].[dbo].[art]
      , art_new AS new
   WHERE
   (
      art.title = new.title
         OR art.id = 1352 AND new.id = 119
         OR art.id = 1353 AND new.id = 120
         OR art.id = 1379 AND new.id = 146
         OR art.id = 1380 AND new.id = 147
   )
      AND art.parent = 1460
)
UPDATE art
SET rest.modify('
    replace value of (/root/e[k="alien_id"]/v[1]/text())[1]
    with sql:column("NewXmlData.newValue")
    ")
')
FROM [pwi_new].[dbo].[art]
INNER JOIN NewXmlData ON art.Id = NewXmlData.Id
...