【问题标题】:modify sql server XML column - is there a more efficient way in my included example修改 sql server XML 列 - 在我包含的示例中是否有更有效的方法
【发布时间】:2013-08-19 22:46:19
【问题描述】:

我一直在使用 SQL Server 和查询,但这是我第一次需要更新 XML 类型的列。

我想要做的(它在下面的代码示例中工作)是找到“名称”等于特定字符串的位置,然后将其相关的“值”更新为新值。

在下面的示例中,我通过使用循环查找索引在 xml 文件中找到包含“UnitPrice”的参数。然后我使用索引来更新参数的值。

主要问题:有没有一种更有效的方法,我不需要使用 while 循环,但可以使用某种类型的 where 语句?

DECLARE @OUTPUTXML AS XML;
SET @OUTPUTXML = '
<OutputParameters>
  <CommitParameters>
    <Parameter>
      <Name>Item</Name>
      <Value >Baseball Bat</Value>
    </Parameter>
    <Parameter>
      <Name>Quantity</Name>
      <Value >35</Value>
    </Parameter>
    <Parameter>
      <Name>UnitPrice</Name>
      <Value >53.99</Value>
    </Parameter>
    <Parameter>
      <Name>Color</Name>
      <Value >Tan</Value>
    </Parameter>
    <Parameter>
      <Name>Style</Name>
      <Value >Wood</Value>
    </Parameter>
    <Parameter>
      <Name>Size</Name>
      <Value >34</Value>
    </Parameter>
    <Parameter>
      <Name>SKU</Name>
      <Value >123456</Value>
    </Parameter>
  </CommitParameters>
</OutputParameters>';

DECLARE @i AS INT;
DECLARE @iOfName AS INT;
DECLARE @nameCheck AS VARCHAR(200);
DECLARE @ParmName AS VARCHAR(200);
DECLARE @maxNames AS INT;
DECLARE @newValue AS VARCHAR(200);

SET @ParmName = 'UnitPrice';
SET @newValue = '62.99';
SET @i = 1;
SET @maxNames = ( SELECT    MAX(@OUTPUTXML.value('count(/OutputParameters/CommitParameters/Parameter)', 'int')) );

WHILE @i <= @maxNames 
    BEGIN

        SET @nameCheck = (SELECT  @OUTPUTXML.value('(/OutputParameters/CommitParameters/Parameter[sql:variable("@i")]/Name/text())[1]',
                        'varchar(200)'));

        IF (RTRIM(@nameCheck) = @ParmName)
        BEGIN
            SET @iOfName = @i;
            BREAK;
        END;      

        SET @i = @i + 1;
    END;

SET 
   @OUTPUTXML.modify('
    replace value of (/OutputParameters/CommitParameters/Parameter[sql:variable("@iOfName")]/Value/text())[1] 
    with sql:variable("@newValue")
    '); 

感谢您的帮助/意见。

【问题讨论】:

    标签: xml performance tsql


    【解决方案1】:

    在这种情况下,无需手动遍历元素。您可以使用 XPath 功能并将必要的Parameter 元素标识为:

    /OutputParameters/CommitParameters/Parameter[Name[.="UnitPrice"]]

    也就是说,你可以做你想做的事,只需以下:

    DECLARE @ParmName AS VARCHAR(200);
    DECLARE @newValue AS VARCHAR(200);
    
    SET @ParmName = 'UnitPrice';
    SET @newValue = '62.99';
    
    set @OUTPUTXML.modify('
        replace value of (/OutputParameters/CommitParameters/Parameter[Name[text()[1]=sql:variable("@ParmName")]]/Value/text())[1] 
        with sql:variable("@newValue")
        '); 
    

    【讨论】:

    • 这正是我想要的。谢谢!
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多