1

我有一个看起来像的 XML 字符串

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

我需要将其插入到诱惑表中

   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

此查询适用于单个 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。您会注意到您有 2 组 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>
于 2012-09-25T23:02:17.847 回答