Динамическая таблица xml в SQL Server - PullRequest
1 голос
/ 08 февраля 2010

У меня есть динамически сгенерированные файлы 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-файле

Кто-нибудь есть идеи

Пример Update1 в C #, который я сделал, но мне нужно сделать это в 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);
        }
    }

РЕЗУЛЬТАТ param1: аааа param2: bbbb param3: 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)   

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

Было бы относительно легко создать 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 голосов
/ 19 марта 2019
--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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...