2010-02-07 86 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