1

次のようなXML文字列があります

  <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)'))

上記の挿入を行うと、最初の列のみが挿入されますが、両方の挿入が必要です

次のように見えるはずです -

                    PlatformName OS     Version
                      Unix         Ipad    5.1
                      Windows      Windows 2008
4

2 に答える 2

1
DECLARE @idoc int

DECLARE @doc varchar(1000)

SET @doc ='
<OutLookContact>
<Contact FirstName="Asif" LastName="Ghafoor" EmailAddress1="asifghafoor@my.web.pk" />
<Contact FirstName="Rameez" LastName="Ali" EmailAddress1="rameezali@my.web.pk" />
<Contact FirstName="Aneel" LastName="Maqsood" EmailAddress1="aneelmaqsood@my.web.pk" />
</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
于 2014-02-11T10:13:38.900 に答える
0

このクエリは、1 つの XML 変数内で最大 1023 のプラットフォームに適しています。この制約はspt_values、シーケンス番号のソースとして使用したためにのみ存在します。より大きな数が必要な場合は、独自のテーブルnumbersまたはテーブルを使用できます。tally

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 です。同じレベル内で ORDER によってのみ識別される PLATFORMNAME、OS、VERSION の 2 つのセットがあることに気付くでしょう。ベスト プラクティスは、次のように 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>
于 2012-09-25T23:02:17.847 に答える