【问题标题】:Dynamic xml to SQL Server table动态 xml 到 SQL Server 表
【发布时间】:2010-02-07 22:35:15
【问题描述】:

我有动态生成的 XML 文件

-----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:aaa 参数2:bbbb 参数3:cccc

UPDATE2 部分解决 我只需要获取 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)   

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    创建 XSLT 转换以将 XML 数据转换为一组 INSERT INTO 语句相对容易。然后你可以执行这些语句。这种方法的用处取决于您需要导入多少数据以及导入数据的速度。

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

    更新: 使用您的代码,您可以使用 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) 
    

    【讨论】:

    • 我需要 tsql 中的简单方法,我可以在 c# 中执行此操作(已发布示例),2.3 小时后,我可以通过替换 tsql 中的拆分字符串来完成此操作,但我相信有一个简单的方法使用xml的方法选择类似这样的东西...声明@foo xml set @foo = N' aaaabbbbcccc 'SELECT'' 作为名称,--??不知道 bar.value('./param1[1]','VARCHAR(14)') 作为值 - 不知道从 @foo.nodes('/items') AS foo(bar)
    • 谢谢你正是我需要的 "bar.value('local-name(.)','VARCHAR(14)')" :)
    【解决方案2】:
    --Convert Dynamically XML Into SQL Server
    
        Declare @XMLFile XML='<xml xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
          <x:PivotCache>
            <x:CacheIndex>1</x:CacheIndex>
            <rs:data>
              <z:row Col1="Name" Col2="Address"/>
              <z:row Col1="Sanju" Col2="Goa"/>
              <z:row Col1="Sonu" Col2="Mumbai" />
                  </rs:data>
          </x:PivotCache>
        </xml>'
    
        ;WITH XMLNAMESPACES('urn:schemas-microsoft-com:office:excel' AS x,
            'urn:schemas-microsoft-com:rowset' AS rs,
            '#RowsetSchema' AS z)
    
             SELECT 
             m.c.value('local-name(.)', 'nvarchar(500)') AS NodeName,
             m.c.value('(.)[1]','nvarchar(1000)') AS [Val]
             FROM @XMLFile.nodes('//x:PivotCache/rs:data/z:row/@*') AS m(c)
    

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多