2012-09-25 68 views
1

我有一個看起來像XML到SQL的臨時表

<PLATFORM> 
    <PLATFORMNAME>UNIX</PLATFORMNAME> 
    <OS>Ipad</OS> 
    <VERSION>5.1</VERSION> 
    <PLATFORMNAME>Windows</PLATFORMNAME> 
    <OS>Windows</OS> 
    <VERSION>2008 (64bit)</VERSION> 
    </PLATFORM> 

,我需要插入一個不是Temptable

Create Table #TempXMLTable 
    (
     PlatformName NVARCHAR(50), 
     OS NVARCHAR(50), 
     PlatformVersion NVARCHAR(50) 
    ) 
    INSERT INTO #TempXMLTable VALUES(
      @XML.value('(/PLATFORM/PLATFORMNAME)[1]', 'nvarchar(MAX)'), 
     @XML.value('(/PLATFORM/OS)[1]', 'nvarchar(MAX)') , 
     @XML.value('(/PLATFORM/VERSION)[1]', 'nvarchar(MAX)')) 

當我做以上僅插入第一列插入一個XML字符串但我想這兩個插入

應該看起來像 -

    PlatformName OS  Version 
         Unix   Ipad 5.1 
         Windows  Windows 2008 

回答

0

該查詢適用於單個XML變量內多達1023個平臺。這個約束僅僅是因爲我使用spt_values作爲序列號的來源。如果您需要更大的數字,您可以使用自己的numberstally表。

INSERT INTO #TempXMLTable 
SELECT --v.number, 
     x.n.value('.','nvarchar(max)'), 
     y.n.value('.','nvarchar(max)'), 
     z.n.value('.','nvarchar(max)') 
from @xml.nodes('/PLATFORM') a(b) 
cross apply (select count(*) from @xml.nodes('//PLATFORMNAME') p(q)) c(countall) 
join master.dbo.spt_values v on v.type='p' and v.number between 1 and countall 
cross apply (select a.b.query('PLATFORMNAME[sql:column("number")]')) x(n) 
cross apply (select a.b.query('OS[sql:column("number")]')) y(n) 
cross apply (select a.b.query('VERSION[sql:column("number")]')) z(n) 

但是,您實際上擁有的是一種實際上不是最佳實踐的XML。你會注意到你有兩組PLATFORMNAME,OS,VERSION,這些PLATFORMNAME,OS,VERSION只在同一級別通過ORDER識別。最佳做法是如此配製XML:

<PLATFORMS> 
    <PLATFORM> 
    <PLATFORMNAME>UNIX</PLATFORMNAME> 
    <OS>Ipad</OS> 
    <VERSION>5.1</VERSION> 
    </PLATFORM> 
    <PLATFORM> 
    <PLATFORMNAME>Windows</PLATFORMNAME> 
    <OS>Windows</OS> 
    <VERSION>2008 (64bit)</VERSION> 
    </PLATFORM> 
</PLATFORMS> 
1
DECLARE @idoc int 

DECLARE @doc varchar(1000) 

SET @doc =' 
<OutLookContact> 
<Contact FirstName="Asif" LastName="Ghafoor" EmailAddress1="[email protected]" /> 
<Contact FirstName="Rameez" LastName="Ali" EmailAddress1="[email protected]" /> 
<Contact FirstName="Aneel" LastName="Maqsood" EmailAddress1="[email protected]" /> 
</OutLookContact>' 

--Create an internal representation of the XML document. 

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc 

-- Execute a SELECT statement that uses the OPENXML rowset provider. 

DECLARE @Temp TABLE(FirstName VARCHAR(250),LastName VARCHAR(250),Email1 VARCHAR(250)) 

INSERT INTO @Temp(FirstName,LastName,Email1) 

SELECT * 

FROM OPENXML (@idoc, '/OutLookContact/Contact',1) 

WITH (FirstName varchar(50),LastName varchar(50),EmailAddress1 varchar(50)) 


select FirstName,LastName,Email1 from @Temp