Есть ли способ обновить столбец xml, используя значение столбца подзапроса?

Я пытаюсь обновить один столбец XML значениями из другого столбца XML той же таблицы, например:

source:
|----|--------------------|----------------------|
|F_ID|F_DATA              |F_RESULT              |
|----|--------------------|----------------------|
|1   |<Email guid="qwe" />|<Request guid="" />   |
|----|--------------------|----------------------|
result:
|----|--------------------|----------------------|
|F_ID|F_DATA              |F_RESULT              |
|----|--------------------|----------------------|
|1   |<Email guid="qwe" />|<Request guid="qwe" />|
|----|--------------------|----------------------|

Таким образом, я пробовал это:

DROP TABLE IF EXISTS #F_DATA;
CREATE TABLE #F_DATA(
    F_ID BIGINT IDENTITY PRIMARY KEY,
    F_DATA XML,
    F_RESULT XML
);
INSERT INTO #F_DATA(F_DATA, F_RESULT)
VALUES('<Email guid="qwe" />', '<Request guid="" />');

UPDATE FU
SET FU.F_RESULT.modify('replace value of (Request/@guid)[1] with {sql:column("F_VALUE")}')
FROM
    #F_DATA FU
INNER JOIN 
    (SELECT
         F_ID,
         F_DATA.value('(Email/@guid)[1]', 'NVARCHAR(MAX)') 'F_VALUE'
     FROM
         #F_DATA) V ON FU.F_ID = V.F_ID;

DROP TABLE IF EXISTS #F_DATA;

Ошибка

Неправильный синтаксис рядом с словом "изменить"

выскочил.

Поработав над этим некоторое время, я попробовал это (просто установив для атрибута обычный текст):

UPDATE #F_DATA
SET F_RESULT.modify('replace value of (Request/@guid)[1] with "myguid"');

и все хорошо. НО

UPDATE FU
SET FU.F_RESULT.modify('replace value of (Request/@guid)[1] with "myguid"')
FROM #F_DATA FU;

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

Похоже, вы можете использовать только те же столбцы или переменные таблицы, что и параметр {sql: *} для .modify (). Есть ли способ сделать это с помощью предложения FROM?


person Dimon_Tools    schedule 10.10.2019    source источник
comment
Никто не ответил на это, потому что совершенно неясно, что вы пытаетесь сделать. Некоторые образцы данных и желаемый результат могут значительно помочь. минимальный воспроизводимый пример   -  person Sean Lange    schedule 10.10.2019
comment
Пожалуйста, предоставьте полученное сообщение об ошибке.   -  person Alexey Usharovski    schedule 10.10.2019
comment
Да, конечно. Сделанный!   -  person Dimon_Tools    schedule 11.10.2019


Ответы (1)


Эта проблема была решена путем удаления псевдонима из обновленной таблицы и удаления '{' и '}' из модификации.

UPDATE #F_DATA
SET F_RESULT.modify('replace value of (Request/@guid)[1] with sql:column("F_VALUE")')
FROM
    #F_DATA
        INNER JOIN
            (SELECT
                F_ID,
                F_DATA.value('(Email/@guid)[1]', 'NVARCHAR(MAX)') 'F_VALUE'
            FROM
                #F_DATA
            ) V ON #F_DATA.F_ID = V.F_ID
;
person Dimon_Tools    schedule 13.10.2019