2013-07-21 27 views
1

我想要获取XML数据并在表的一行中插入每个节点值。例如,我有:将XML节点插入到SQL Server中的表中

<Tags> 
    <Tag>a</Tag> 
    <Tag>b</Tag> 
    <Tag>c</Tag> 
</Tags> 

,我想插入一个,b和c在名为Tags表。我应该怎么做?

到目前为止我有这个代码,但我不知道如何在xquery部分定义@I。顺便问一下,有没有更简单的方法?

CREATE TABLE #T (tag nvarchar(100)) 

DECLARE @TagsXML xml 
DECLARE @TagsCount int 
DECLARE @I int = 0 

SET @TagsXML = '<Tags><Tag>a</Tag><Tag>b</Tag><Tag>c</Tag></Tags>' 
SET @TagsCount = (SELECT T.x.value('count(Tag)', 'nvarchar(100)') FROM @TagsXML.nodes('Tags') T(x)) 

WHILE @I < @TagsCount 
BEGIN 
    INSERT INTO #T VALUES ((SELECT T.x.value('concat("Tag[", @I, "]")', 'nvarchar(100)') FROM @TagsXML.nodes('Tags') T(x))) 
    SET @I = @I + 1 
END 

SELECT * FROM #T 

回答

5

请勿使用WHILE循环 - 想一想!

你可以在一个声明中做到这一点很容易:

INSERT INTO #T(tag) 
    SELECT 
     XTags.value('.', 'nvarchar(100)') 
    FROM 
     @TagsXML.nodes('/Tags/Tag') AS XTbl(XTags) 

.nodes()调用给你匹配这个XPath表达式(如XML片段)的XML标签的列表 - 在这里,你会得到一个所有<tag>元素的列表。并从该XML片段列表中选取唯一元素的内容为nvarchar(100)并将其插入表中。更有效率和更好的表现比一个012AR循环RBAR(逐行激动 - 行)方法

+0

我真的很感谢:) –