2010-02-07 83 views
1

我已动态生成的XML文件动态XML到SQL Server表

-----Example1----- 
<items> 
<param1>aaaa</param1> 
<param2>bbbb</param2> 
<param3>cccc</param3> 
</items> 
-----Example2----- 
<items> 
<test1>dddd</test1> 
<test7>eeee</test7> 
<john1>ffff</john1> 
<john2>ffff</john2> 
</items> 

我想这个XML文件转换为表这样

-----SQL TABLE for Example1----- 
Name  Value 
param1 aaaa 
param2 bbbb 
param3 cccc 
-----SQL TABLE for Example2----- 
Name  Value 
test1 dddd 
test7 eeee 
john1 ffff 
john2 ffff 

问题 - 项目XML标签名称不同在每个xml文件中(如样本中) - 每个xml文件中的项目编号不同

任何人都有任何想法

在C#

UPDATE1样,我已经做了,但我需要为此在T-SQL :(

public static void test() 
    { 

     string test = @" 
     <items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
     </items> 
     "; 

     XmlDocument newdoc = new XmlDocument(); 
     XmlNode root = newdoc.CreateElement("dataset"); 
     newdoc.AppendChild(root); 
     XmlDocument doc = new XmlDocument(); 
     doc.InnerXml = test; 
     XmlNodeList lst = doc.SelectNodes("//items/*"); 
     foreach (XmlNode item in lst) 
     { 
      Console.WriteLine(item.Name + ": " + item.InnerXml); 
     } 
    } 

结果 参数1:AAAA 参数2:BBBB 参数3:CCCC

UPDATE2 partialy解决 我只需要得到XML标签名称

declare @foo xml 
set @foo = N' 
<items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
</items>' 

SELECT 
'' as name, --?? no idea how to get names param1,param2,param3 
bar.value('./.','VARCHAR(14)') as value 
FROM 
@foo.nodes('/items/*') AS foo(bar) 

回答

1

这将是比较容易的创建一个XSLT转换来转换将XML数据转换为一组INSERT INTO语句。然后你可以执行这些语句。该方法的有用程度取决于多少数据以及您需要多快导入它。

如果您还没有表,您甚至可以让XSLT执行CREATE TABLE DDL。

UPDATE: 使用你的代码,你可以使用local-name()函数:

declare @foo xml 
set @foo = N' 
<items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
</items>' 

SELECT 
bar.value('local-name(.)','VARCHAR(14)') as name, 
bar.value('./.','VARCHAR(14)') as value 
FROM 
@foo.nodes('/items/*') AS foo(bar) 
+0

我需要在TSQL简单的方法,我可以在C#(贴样品)做到这一点,2,3后小时我可以通过TSQL替换字符串劈裂完成这件事,但我相信,有使用XML选择这样的一个简单的方法... 声明@foo XML 集@foo = N” AAAA BBBB CCCC ' SELECT '' 姓名, - ??不知道 bar.value('./ param1 [1]','VARCHAR(14)')作为值 - 不知道热点获取多行 FROM @ foo.nodes('/ items')AS foo酒吧) – wicherqm 2010-02-07 23:00:24

+0

谢谢 正是我所需要的 “bar.value('local-name(。)','VARCHAR(14)')”:) – wicherqm 2010-02-08 12:28:54