[英]SQL Server XQuery.modify syntax issues, unable to resolve
我有一个 SQL Server 2016 表dbo.Agent
,它有一个名为XMLDta
的列,但它的数据类型是nvarchar(max)
。
此列中的数据结构为 XML,如下所示:
<misc id="m12345">
<pauth id="p12345">
<AEmail/>
<ipauth id="i12345">
<IProd>xxxxxx</IProd>
<achannel id="00000000">
<Chan>ABCEDF</Chan>
<Selected>1</Selected>
</achannel>
<Seg>ZZZ</Seg>
<states id="s12345">
<Sel>0</Sel>
<Avail>1</Avail>
<State>XX</State>
</states>
<states id="s67890">
<Sel>1</Sel>
<Avail>1</Avail>
<State>YY</State>
</states>
<LOB>FFFF</LOB>
<AUW>abc@email.com</AUW>
<WQue>10</WQue>
<AgChan>ABCEDF,</AgChan>
<State>XX,YY,</State>
<Status>Active</Status>
</ipauth>
<ipauth>
....
</ipauth>
</pauth>
</misc>
尝试使用以下XQuery.modify()
SQL/XQuery 语句修改上述 xml 中的Status
节点:
UPDATE dbo.Agent
SET CAST(xmldta AS xml).modify('replace value of (/misc/pauth/ipauth/Status/text()) with "Pending"')
WHERE agID = 209
但我不断收到以下错误:
'(' 附近的语法不正确。
还尝试使用此 SQL:
DECLARE @Dta As XML
DECLARE @id AS INT = 209
SELECT @Dta = CAST(XMLDta AS XML)
FROM dbo.Agent
WHERE agID = @id
UPDATE dbo.Agent
SET @Dta.modify('replace value of (/misc/pauth/ipauth/Status/text()) with "Pending"')
WHERE agID = 209
但我仍然得到同样的错误:
'(' 附近的语法不正确。
如何正确构建我的 SQL 语句,以便它可以引用XQuery.modify
function 中的XMLDta
列?
请记住XMLDta
列在dbo.Agent
表中的数据类型为nvarchar(max)
。
如果我要走这条错误的路,请告诉我并建议更好的路径。
谢谢,任何指导将不胜感激。 丽贝卡
请注意,SQL Server XQuery .modify()
方法一次只会更新一个 XML 元素。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata NVARCHAR(MAX));
INSERT INTO @tbl (xmldata) VALUES
(N'<misc id="m12345">
<pauth id="p12345">
<AEmail/>
<ipauth id="i12345">
<IProd>xxxxxx</IProd>
<achannel id="00000000">
<Chan>ABCEDF</Chan>
<Selected>1</Selected>
</achannel>
<Seg>ZZZ</Seg>
<states id="s12345">
<Sel>0</Sel>
<Avail>1</Avail>
<State>XX</State>
</states>
<states id="s67890">
<Sel>1</Sel>
<Avail>1</Avail>
<State>YY</State>
</states>
<LOB>FFFF</LOB>
<AUW>abc@email.com</AUW>
<WQue>10</WQue>
<AgChan>ABCEDF,</AgChan>
<State>XX,YY,</State>
<Status>Active</Status>
</ipauth>
<ipauth>....</ipauth>
</pauth>
</misc>');
-- DDL and sample data population, end
DECLARE @Dta AS XML
, @param VARCHAR(30) = 'Pending'
, @id AS INT = 1;
SET @Dta = (SELECT TRY_CAST(xmldata AS XML) FROM @tbl WHERE ID = @id);
SET @Dta.modify('replace value of (/misc/pauth/ipauth/Status/text())[1] with sql:variable("@param")');
UPDATE @tbl
SET xmldata = TRY_CAST(@Dta AS NVARCHAR(MAX))
WHERE ID = 1;
SELECT * FROM @tbl;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.