Possible Duplicate:
07000
假设我有一个带有XML列的数据库表.
结构看起来像这样:
<Parent1> <Parent2> <Child> test 1 </Child> </Parent2> <Parent2> <Child> test 2 </Child> </Parent2> </Parent1>
我想对结构中的每个’Child’节点进行一些处理,并用结果更新它们.
例如,我想用’something’替换’test’这个词.
所以我不希望两个子节点最终都包含’1号’.
相反,我希望第一个子节点包含’something 1′,第二个子节点包含’something 2′.
我可以编写以下内容,一次定位一个节点:
DECLARE @replacement NVARCHAR(4000) = 'something 1' UPDATE MyTable SET MyXMLField.modify('replace value of (Parent1[1]/Parent2[1]/Child[1]/text())[1] with sql:variable("@replacement")') WHERE Id = 1
解决方法
你必须在一个循环中,一次一个节点.
declare @MyTable table(Id int,MyXMLField xml) insert into @MyTable values (1,'<Parent1> <Parent2> <Child>test 1</Child> </Parent2> <Parent2> <Child>test 2</Child> </Parent2> </Parent1>') declare @replacement nvarchar(4000) = 'something 1' declare @Parent2Count int select @Parent2Count = MyXMLField.value('count(/Parent1/Parent2)','int') from @MyTable where Id = 1 declare @Node int set @Node = 1 while @Node <= @Parent2Count begin update @MyTable set MyXMLField.modify('replace value of (/Parent1/Parent2[sql:variable("@Node")]/Child/text())[1] with sql:variable("@replacement")') where Id = 1 set @Node = @Node + 1 end