2012-11-27 194 views
1

我有一個帶有多個元素和屬性的XML(您可以在下面看到一個示例),我想從中創建一個SQL表/表。層次結構XML到SQL

XML例如:

<prgs> 
<prg Id="1" > 
    <name>Xulescu</name> 
    <type>Human</type> 
    <attribs> 
    <attrib>doesn't matter</attrib> 
    </attribs> 
    <timeZone>doesn't matter</timeZone> 
    <URL>doesn't matter/</URL> 

..... 
</prgs> 

我需要這樣的

ID  |  Name 
------------------------- 
1  |  Xulescu 
...... 

表感謝您

另一種情況

這個怎麼樣?

<schedules type="tip1"> 
    <schedule prgsId="15361" > 
    <event Id="1234" date="2012-10-05"> 
     <times> 
     <time>01:00</time> 
     </times> 
    </event> 
    <event Id="2345" date="2012-10-05"> 
     <times> 
     <time>01:30</time> 
     </times> 
    </event> 

結果應該是一個表

ID  ScheduleID  PrgsID  showId  Date  Time 
    ................................................................. 
    1  xxx   xxxx   1234  2012-10-05 01:00 
    2  xxx   xxxx   2345  2012-10-05 01:30 

ID是一個自動增量字段

ScheduleID, PrgsID是FK鍵

回答

1

像這樣:

DECLARE @XmlFile XML 

SELECT @XmlFile = CAST(BulkColumn AS XML) 
FROM OPENROWSET (BULK 'C:\temp\sample.xml' , SINGLE_BLOB) AS XMLDATA 

SELECT 
    ID = Prgs.value('@Id', 'int'), 
    Name = Prgs.value('(name)[1]', 'varchar(50)') 
FROM 
    @XmlFile.nodes('/prgs/prg') AS XTbl(Prgs) 

如果文件中包含此XML:

​​

你會得到這樣的輸出:

ID Name 
------------ 
1 Xulescu 
2 Xulescu2 

更新:爲您額外的場景 - 這個怎麼樣? (假設你已經在@XML變量你的XML結構):

INSERT INTO dbo.YourTable(ScheduleID, PrgsID, ShowId, [Date], [Time]) 
    SELECT 
     Sched.value('@prgsId', 'int'), 
     Sched.value('@prgsId', 'int'), 
     Events.value('@Id', 'int'), 
     Events.value('@date', 'date'), 
     Events.value('(times/time)[1]', 'varchar(50)') 
    FROM 
     @XML.nodes('/schedules/schedule') AS XTbl(Sched) 
    CROSS APPLY 
     Sched.nodes('event') AS XTbl2(Events) 

不知道如何/你想在ScheduleIdPrgsId哪個屬性 - 我只看到一個<schedule>屬性PrgsId ...

+0

謝謝。我明白。如果我需要更多幫助,我會回來的。 – Kosmog

+0

@ user1607079:更新了我的響應,顯示如何首先加載外部XML文件。該文件**必須在SQL Server計算機的硬盤上**。如果該SQL Server計算機不是*您的本地PC,則該SQL Server計算機**不能**讀取您自己的本地硬盤 - 該文件必須位於該定義的目錄中的服務器計算機上 –

+0

但是,如果我有這樣的情況:@ input.nodes('/ schedules')AS XTbl(Schdl),我想提取Tip = Schdl.value('@ type','varchar(MAX)')。 Foreach'tip'上面定義了名稱和Id(你的答案 - 我從這裏提取它們@ input.nodes('/ schedules/schedule/lala')AS XTbl(Prgs)) – Kosmog