use*_*035 5 xml sql-server sql-server-2005 xml-dml
我有一个从单个select语句创建的@XML文档。
<root>
<node>
<node1>
<targetNode>
</targetNode>
</node1>
<node1>
<targetNode>
</targetNode>
</node1>
<node1>
<targetNode>
</targetNode>
</node1>
</node>
<node>
......
</node>
</root>
Run Code Online (Sandbox Code Playgroud)
我想将xsi:nil插入此文档的'targetNode'属性。
@XML.modify( 'insert attribute xsi:nil {"true"} into (root/node/node1/targetNode) [1]')
Run Code Online (Sandbox Code Playgroud)
上面的代码会将属性插入@XML文档中targetNode的第一次出现。但是,insert语句仅在单个节点上起作用。有什么方法可以将此属性插入@XML文档中的targetNode的所有实例中。
我在多个节点上的DML操作中 找到了一个简单而优雅的解决方案http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx
这个想法是计算有多少个节点,并一一修改它们:
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
Run Code Online (Sandbox Code Playgroud)
小智 1
您可以使用 XSINILL 参数在用于创建 xml 的选择中执行此操作。
http://msdn.microsoft.com/en-us/library/ms178079.aspx
(这是一个非常粗略的例子)
--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
Run Code Online (Sandbox Code Playgroud)