2014-04-15 1 views
0

데이터베이스의 행과 열의 형식으로 가져와야하는 XML 데이터가 데이터베이스에 있어야합니다. 내 XML은XML 데이터를 SQL Server의 행 열 데이터로 변환하는 방법

<Equipment> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>APPLE iPH564WHT</MfgName><Model>885909600205</Model><ActDate>10/26/2012</ActDate><CancelDate /> 
</EquipmentRecord> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>SAMSUNG D710 HANDSET KIT</MfgName><Model>SPHD710KIT</Model><ActDate>09/04/2012</ActDate><CancelDate>10/01/2012</CancelDate> 
</EquipmentRecord> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>BLACKBERRY 9670 PURPLE</MfgName><Model>SPRIM9670P</Model><ActDate>08/22/2012</ActDate><CancelDate>08/25/2012</CancelDate> 
</EquipmentRecord> 
</Equipment> 

처럼 그리고 나는 어떤 간단한 방법은 SQL 서버에서이 거기에있다 데이터가

EquipmentType MfgName     Model   ActDate  CancelDate 
E    APPLE iPH564WHT   885909600205 10/26/2012 
E    SAMSUNG D710 HANDSET KIT SPHD710KIT  09/04/2012 10/01/2012 
E    BLACKBERRY 9670 PURPLE SPRIM9670P  08/22/2012 08/25/2012 

처럼 당겨 싶어?

나는 시도하고

DECLARE @doc XML 
SET @doc = 'above XML' 

CREATE TABLE #EquipmentType (ID INT IDENTITY(1,1), EquipmentType varchar(100)) 
INSERT INTO #EquipmentType(EquipmentType) 
SELECT EquipmentDetails.value('.','varchar(100)') as EquipmentType 
FROM @doc.nodes('/Equipment/EquipmentRecord/EquipmentType/.') Equipment(EquipmentDetails) 

CREATE TABLE #MfgName (ID INT IDENTITY(1,1), MfgName varchar(500)) 
INSERT INTO #MfgName(MfgName) 
SELECT EquipmentDetails.value('.','varchar(500)') as MfgName 
FROM @doc.nodes('/Equipment/EquipmentRecord/MfgName/.') Equipment(EquipmentDetails) 

CREATE TABLE #Model (ID INT IDENTITY(1,1), Model varchar(500)) 
INSERT INTO #Model(Model) 
SELECT EquipmentDetails.value('.','varchar(500)') as Model 
FROM @doc.nodes('/Equipment/EquipmentRecord/Model/.') Equipment(EquipmentDetails) 

CREATE TABLE #ActDate (ID INT IDENTITY(1,1), ActDate varchar(500)) 
INSERT INTO #ActDate(ActDate) 
SELECT EquipmentDetails.value('.','varchar(500)') as ActDate 
FROM @doc.nodes('/Equipment/EquipmentRecord/ActDate/.') Equipment(EquipmentDetails) 

CREATE TABLE #CancelDate (ID INT IDENTITY(1,1), CancelDate varchar(500)) 
INSERT INTO #CancelDate(CancelDate) 
SELECT EquipmentDetails.value('.','varchar(500)') as CancelDate 
FROM @doc.nodes('/Equipment/EquipmentRecord/CancelDate/.') Equipment(EquipmentDetails) 

SELECT EquipmentType,MfgName,Model,ActDate,CancelDate 
FROM #EquipmentType ET 
Inner Join #MfgName MN ON (ET.ID = MN.ID) 
Inner Join #Model MO ON (MN.ID = MO.ID) 
Inner Join #ActDate AD ON (MO.ID = AD.ID) 
Inner Join #CancelDate CD ON (AD.ID = CD.ID) 

DROP TABLE #EquipmentType 
DROP TABLE #MfgName 
DROP TABLE #Model 
DROP TABLE #ActDate 
DROP TABLE #CancelDate 

을했다하지만 난이 할 수있는 간단한 방법을 줄까?

답변

1

OPENXML을 사용하십시오. 메모리 누수를 방지하기 위해 문서 참조 (sp_xml_removedocument를)을 제거해야합니다 :

DECLARE @X XML = '<Equipment> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>APPLE iPH564WHT</MfgName><Model>885909600205</Model><ActDate>10/26/2012</ActDate><CancelDate /> 
</EquipmentRecord> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>SAMSUNG D710 HANDSET KIT</MfgName><Model>SPHD710KIT</Model><ActDate>09/04/2012</ActDate><CancelDate>10/01/2012</CancelDate> 
</EquipmentRecord> 
<EquipmentRecord> 
<EquipmentType>E</EquipmentType><MfgName>BLACKBERRY 9670 PURPLE</MfgName><Model>SPRIM9670P</Model><ActDate>08/22/2012</ActDate><CancelDate>08/25/2012</CancelDate> 
</EquipmentRecord> 
</Equipment>' 


DECLARE @iX INT 
EXEC sp_xml_preparedocument @ix output, @x 


SELECT EquipmentType, MfgName, Model, ActDate, CancelDate = NULLIF(CancelDate, '1900-01-01') 
FROM OPENXML(@iX, '//EquipmentRecord', 2) 
WITH (EquipmentType varchar(10), 
     MfgName VARCHAR(100), 
     Model VARCHAR(100), 
     ActDate DATE, 
     CancelDate date) 

EXEC sp_xml_removedocument @iX 
+0

이 감사를했다. OPENXML에 대해 더 많은 것을 이해하려고합니다. 지식에 감사드립니다. –

3

다음 쿼리는 작동합니다 :

declare @X xml = 'your xml'; 

select x.r.value('(EquipmentType)[1]', 'varchar(100)') as [EquipmentType], 
    x.r.value('(MfgName)[1]', 'varchar(500)') as [MfgName], 
    x.r.value('(Model)[1]', 'varchar(500)') as [Model], 
    x.r.value('(ActDate)[1]', 'varchar(500)') as [ActDate], 
    x.r.value('(CancelDate)[1]', 'varchar(500)') as [CancelDate] 
from @X.nodes('/Equipment/EquipmentRecord') as x(r); 
+0

고마워요. –

+0

놀랍습니다. 고마워요! –

관련 문제