繁体   English   中英

SQL 服务器 XQuery.modify 语法问题,无法解决

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM