有没有办法使用子查询列值更新 xml 列?
Is there a way to update xml column using subquery column value?
我正在尝试使用同一 table 的另一 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;
一个错误
Incorrect syntax near 'modify'
弹出。
经过一段时间的研究,我尝试了这个(只是将纯文本设置为属性):
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;
再次显示相同的错误,尽管查询与上一个几乎相同。
看起来您只能使用相同的 table 列或变量作为 .modify() 的 {sql:*} 参数。
有没有办法用 FROM
子句来做到这一点?
此问题已通过从更新的 table 中删除别名并从修改中删除“{”和“}”得到解决。
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
;
我正在尝试使用同一 table 的另一 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;
一个错误
Incorrect syntax near 'modify'
弹出。
经过一段时间的研究,我尝试了这个(只是将纯文本设置为属性):
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;
再次显示相同的错误,尽管查询与上一个几乎相同。
看起来您只能使用相同的 table 列或变量作为 .modify() 的 {sql:*} 参数。
有没有办法用 FROM
子句来做到这一点?
此问题已通过从更新的 table 中删除别名并从修改中删除“{”和“}”得到解决。
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
;