首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL2005中的XML.modify()在多个XML节点中插入属性

使用SQL2005中的XML.modify()在多个XML节点中插入属性
EN

Stack Overflow用户
提问于 2009-02-11 12:38:34
回答 3查看 7.3K关注 0票数 5

我有一个从单个select语句创建的@XML文档。

代码语言:javascript
复制
<root>
 <node>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
 </node>
 <node>
  ......
 </node>
</root>

我想插入xsi:nil作为这个文档的'targetNode‘属性。

代码语言:javascript
复制
@XML.modify( 'insert attribute xsi:nil {"true"} into (root/node/node1/targetNode) [1]') 

上面的代码将把属性插入到@XML文档中第一次出现的targetNode中。但是,insert语句仅在单个节点上有效。有没有什么方法可以将这个属性插入到@XML文档中的所有targetNode实例中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-11 14:06:58

您可以使用XSINILL参数在用于创建xml的select中执行此操作。

http://msdn.microsoft.com/en-us/library/ms178079.aspx

(这是一个非常粗略的例子)

代码语言:javascript
复制
--create 2 tables and put some data in them
create table node
(
   id int identity(1,1) primary key,
   node int
)
GO
create table node1
(
   id int identity(1,1) primary key,
   nodeid int foreign key references node(id),
   targetnode int
)
GO

insert into node
select 1
GO 5

insert into node1
select 1,2
union 
select 2,null
union 
select 3,2
union 
select 4,null
--

--select statement to generate the xml
SELECT TOP(1)
   (SELECT
      (  SELECT targetnode
         FROM    node1
         WHERE   nodeid = node.id 
         FOR XML AUTO,
         ELEMENTS XSINIL,
         TYPE
      )
   FROM    node FOR XML AUTO,
   ELEMENTS,
   TYPE
   )
FROM   node FOR XML RAW('root'),
       ELEMENTS
票数 1
EN

Stack Overflow用户

发布于 2013-03-25 23:34:44

我在多个节点上的DML操作中找到了一个简单而优雅的解决方案 http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

这个想法是计算有多少个节点,并逐个修改它们:

代码语言:javascript
复制
DECLARE @iCount int
SET @iCount = @var.value('count(root/node/node1/targetNode)','int')

DECLARE @i int
SET @i = 1

WHILE (@i <= @iCount)
BEGIN
   @xml.modify('insert attribute xsi:nil {"true"} into (root/node/node1/targetNode)[sql:variable("@i")][1]')
   SET @i = @i + 1
END
票数 5
EN

Stack Overflow用户

发布于 2009-02-11 13:34:39

使用modify-函数不可能做到这一点。它只能在单个节点上工作。

您可以将其作为字符串进行操作,尽管这肯定很难看,并且在某些情况下可能是错误的,这取决于XML的实际结构。

如下所示:

代码语言:javascript
复制
declare @xml as xml
set @xml = '<root>
 <node>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
 </node>
</root>
'

set @xml = replace(cast(@xml as nvarchar(max)), '<targetNode/>', '<targetNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />')
select @xml
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/536597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档