我试图更新XML字符串中复杂类型的一部分的元素。 where子句被忽略,字符串的第一个元素是唯一被解开的元素。SQL Server 2008 R2表更新XML列修改忽略where子句
XML架构集合(简化形式):
<element name="rangeDef">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="defs">
<complexType>
<sequence>
<element name="ID" type="string"/>
<element name="available" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
填充字符串为:
<rangeDef>
<defs>
<ID>AA</ID>
<available>Y</available>
</defs>
<defs>
<ID>AB</ID>
<available>Y</available>
</defs>
<defs>
<ID>AC</ID>
<available>Y</available>
</defs>
<defs>
<ID>AD</ID>
<available>Y</available>
</defs>
<defs>
<ID>AE</ID>
<available>Y</available>
</defs>
</rangeDef>
,这是保存在一个表 - >testDef (key char(10), rangeDef xml)
UPDATE语句:
update testDef
set rangeDef.modify('replace value of (//defs/available)[1] with "N"')
where rangeDef.exist ('//defs[ID = sql:variable("@myValue")] = 1 and
key = @myKey
@myValue
被声明为char(2)
并设置为'AD'
@myKey
是简单的搜索关键字。
随着(//...)[1]的修改语法,选择一个节点作为XML字符串中的第一个节点,并忽略where子句。不知道在语法中需要哪些更正,例如rangeDef.exist将寻找XML字符串的适当元素。我的想法是,我应该使用position()函数,而不是指示[1],但我不清楚它是如何实现的。