【发布时间】: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