【问题标题】:Modify XML in SQL field stored as Varbinary修改存储为 Varbinary 的 SQL 字段中的 XML
【发布时间】:2019-03-23 02:08:05
【问题描述】:

我的 XML 在字段中存储为 varbinary。

SELECT  cast (inboxXml as xml) FROM globalDB.Inbox WHERE inboxCId = '207435-N'

我想更新一个属性(如下)。但是错误是“无法调用 varbinary(max) 上的方法”。我尝试了不同的方式来投射它,但我找不到它。

谢谢你,

;WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema')
UPDATE globalDB.Inbox
SET inboxXml.modify('replace value of (//ReceiveDeliveryHeader/DocumentID/ID/@accountingEntity[.="ABC"])[1] with "ZZZ"')
WHERE inboxCId = '207435-N'

【问题讨论】:

    标签: sql-server xml tsql casting dml


    【解决方案1】:

    第一个问题是:为什么要将 XML 存储在 VARBINARY 列中?

    这是缓慢、笨拙和错误的......

    第二件事是:.modify() 仅适用于真正的原生 XMLinboxXml.modify()CAST(inboxXml AS XML).modify() 都不起作用...

    这是将列类型更改为 XML 的另一个原因...

    试试这个:

    DECLARE @tbl TABLE(ID INT IDENTITY,YourXml VARBINARY(MAX));
    
    DECLARE @SomeXML XML='<root><someNode someAttr="test">content</someNode></root>';
    
    INSERT INTO @tbl VALUES(CAST(@SomeXML AS VARBINARY(MAX)));
    

    --这行得通

    SELECT ID
          ,YourXml
          ,CAST(YourXml AS XML)
    FROM @tbl
    WHERE ID=1;
    

    --但这是不允许的

    UPDATE @tbl SET CAST(YourXml AS XML).modify('replace value of (/root/someNode/@someAttr)[1] with "blah"')
    WHERE ID=1
    

    --你可以做什么:

    DECLARE @intermediateXML XML= (SELECT CAST(YourXml AS XML) FROM @tbl WHERE ID=1);
    SET @intermediateXML.modify('replace value of (/root/someNode/@someAttr)[1] with "blah"');
    UPDATE @tbl SET YourXml=CAST(@intermediateXML AS VARBINARY(MAX)) WHERE ID=1;
    
    --voila!
    SELECT ID
          ,YourXml
          ,CAST(YourXml AS XML)
    FROM @tbl
    WHERE ID=1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多