我有一个类似于
的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
答案 0 :(得分: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
答案 1 :(得分: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。您会注意到,您有两组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>