我正在努力创建一个modify()语句来更改具有该属性值的所有元素中属性的值 - 到目前为止,我只能让它更改第一个匹配元素中的值。我在下面创建了一个示例,其中包含了我在SQL Server 2005中运行的内容:
DECLARE @x XML
SELECT @x = '
<FootballApparel>
<Item Team="Phoenix Cardinals" Type="Hat" Cost="$14.99" />
<Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" />
<Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" />
<Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" />
<Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" />
<Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" />
</FootballApparel>
';
SET @x.modify('
replace value of
(/FootballApparel/Item[@Team="Phoenix Cardinals"]/@Team)[1]
with "Arizona Cardinals"
');
SELECT @x;
运行此结果会给出以下结果 - 只有Phoenix Cardinals的第一个实例已被更改。
<FootballApparel>
<Item Team="Arizona Cardinals" Type="Hat" Cost="$14.99" />
<Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" />
<Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" />
<Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" />
<Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" />
<Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" />
</FootballApparel>
是否可以帮助我使用正确的modify()语句来替换所有实例?
谢谢!
凯文
答案 0 :(得分:5)
你非常接近 - 你需要做的就是循环(在这种情况下没有别的方法可以做到)并重复替换值:
WHILE @x.exist('(/FootballApparel/Item[@Team=sql:variable("@oldTeamName")])[1]') = 1
SET @x.modify('
replace value of (
/FootballApparel/Item[@Team=sql:variable("@oldTeamName")]/@Team
)[1]
with sql:variable("@newTeamName")
');
这应该可以解决问题。
马克