2017-03-08 2 views
1

XML에서 값을 추출하려고하는데 어려움을 겪고있는 것 같습니다. 누군가가SQL Server 2008의 XML 특성 값 가져 오기 OPENXML 사용

을 도울 수 있기를 바랍니다 여기에 식별자, ProductItemCode, NetWeight, GrossWeight, 그리고 PackDate 및 SlgrDate의 속성 값입니다 무엇을 추출 할 내 XML

 '<Transfer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Products> 
     <Product TUT="true" ID="38319223176264031724"> 
      <Identifier>38319223176264031724</Identifier> 
      <ProductItemCode>83192</ProductItemCode> 
      <Qty>1</Qty> 
      <NetWeight>23.100</NetWeight> 
      <GrossWeight>23.684</GrossWeight> 
      <SerialNumber>317</SerialNumber> 
      <ECertItemNumber>2</ECertItemNumber> 
      <Markets Type="ECERT"> 
       <Market>EU</Market> 
       <Market>US</Market> 
      </Markets> 
      <Attribute Name="PackDate">2016-09-20T00:00:00</Attribute> 
      <Attribute Name="PlantID">124</Attribute> 
      <Attribute Name="SlgrDate">2016-09-19T00:00:00</Attribute> 
     </Product> 
     <Product TUT="true" ID="28319219766306010024"> 
      <Identifier>28319219766306010024</Identifier> 
      <ProductItemCode>83192</ProductItemCode> 
      <Qty>1</Qty> 
      <NetWeight>19.700</NetWeight> 
      <GrossWeight>20.284</GrossWeight> 
      <SerialNumber>100</SerialNumber> 
      <ECertItemNumber>2</ECertItemNumber> 
      <Markets Type="ECERT"> 
       <Market>EU</Market> 
       <Market>US</Market> 
      </Markets> 
      <Attribute Name="PackDate">2016-11-01T00:00:00</Attribute> 
      <Attribute Name="PlantID">124</Attribute> 
      <Attribute Name="SlgrDate">2016-10-31T00:00:00</Attribute> 
     </Product> 
</Products> 
    </Transfer>' 

입니다.

내가 쉽게 속성 PackDate의 가치와 SlgrDate를 제외한 모든 필드를 얻을 수

다음

if OBJECT_ID('tempdb..#XmlImportTest') is not null 
drop table #XmlImportTest 


CREATE TABLE #XmlImportTest(
xmlFileName VARCHAR(300) NOT NULL, 
xml_data XML NOT NULL 
) 
GO 

DECLARE @xmlFileName VARCHAR(3000) 

SELECT @xmlFileName = 'K:\Upload\CSNXML\WaybillXml.xml' 


--– dynamic sql is just so we can use @xmlFileName variable in OPENROWSET 

EXEC('INSERT INTO #XmlImportTest(xmlFileName, xml_data) 

SELECT ''' + @xmlFileName + ''', xmlData 
FROM(
SELECT * 
FROM OPENROWSET (BULK ''' + @xmlFileName + ''', SINGLE_BLOB) AS XMLDATA 
) AS FileImport (XMLDATA) 
') 
GO 


DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) 


select @xml = (SELECT xml_data from #XmlImportTest) 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 


SELECT Identifier as barcode,ProductItemCode as standpack,SerialNumber, NetWeight netwt_ind, GrossWeight grosswt_ind 
FROM OPENXML (@hDoc, '/Transfer/Products/Product',2) 
WITH (Identifier varchar(80), 
ProductItemCode varchar(10), 
SerialNumber varchar(48), 
NetWeight decimal(13,2), 
GrossWeight decimal(13,2) 
) 


exec sp_xml_removedocument @hDoc 

xml 파일은 XML이 을 제공하는 샘플과 같은 들어있는 필드 내 코드입니다 이제는 각 제품의 속성에서 가치를 얻는 방법을 모릅니다.

난 당신이 원하는 노드에 XPath를 지정하는 SQL 서버 2008

답변

1

사용 옵션 ColPattern에서 이것을 실행하고 있습니다.

FROM OPENXML (@hDoc, '/Transfer/Products/Product',2) 
WITH (
    Identifier varchar(80), 
    ProductItemCode varchar(10), 
    SerialNumber varchar(48), 
    NetWeight decimal(13,2), 
    GrossWeight decimal(13,2), 
    PackDate datetime 'Attribute[@Name = "PackDate"]', 
    PlantID int 'Attribute[@Name = "PlantID"]', 
    SlgrDate datetime 'Attribute[@Name = "SlgrDate"]' 
    ) 
+0

대접 받았다. 대단히 감사합니다. 정말 시간과 노력을 주셔서 감사합니다. – Harry

1

FROM OPENXML- - 날짜 XML 형-방법을 사용하는

시도를 (드문 예외가 존재) 오래된 더 이상 사용하지 않아야합니다 :

SELECT p.value(N'@TUT',N'bit') AS TUT 
     ,p.value(N'@ID',N'nvarchar(max)') AS ID 
     ,p.value(N'(Identifier/text())[1]',N'nvarchar(max)') AS Identifier 
     ,p.value(N'(ProductItemCode/text())[1]',N'int') AS ProductItemCode 
     ,p.value(N'(Qty/text())[1]',N'int') AS Qty 
     ,p.value(N'(NetWeight/text())[1]',N'decimal(14,4)') AS NetWeight 
     ,p.value(N'(SerialNumber/text())[1]',N'int') AS SerialNumber 
     ,p.value(N'(ECertItemNumber/text())[1]',N'int') AS ECertItemNumber 
     ,p.value(N'(Markets/@Type)[1]',N'nvarchar(max)') AS Markets_Type 
     ,m.value(N'text()[1]',N'nvarchar(max)') AS Markets_Market 
     ,p.value(N'(Attribute[@Name="PackDate"]/text())[1]',N'datetime') AS PackDate 
     ,p.value(N'(Attribute[@Name="PlantID"]/text())[1]',N'int') AS PlantID 
     ,p.value(N'(Attribute[@Name="SlgrDate"]/text())[1]',N'datetime') AS SlgrDate 
FROM @xml.nodes(N'Transfer/Products/Product') AS A(p) 
CROSS APPLY a.p.nodes(N'Markets/Market') AS B(m); 

결과

+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 
| TUT | ID     | Identifier   | ProductItemCode | Qty | NetWeight | SerialNumber | ECertItemNumber | Markets_Type | Markets_Market | PackDate    | PlantID | SlgrDate    | 
+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 
| 1 | 38319223176264031724 | 38319223176264031724 | 83192   | 1 | 23.1000 | 317   | 2    | ECERT  | EU    | 2016-09-20 00:00:00.000 | 124  | 2016-09-19 00:00:00.000 | 
+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 
| 1 | 38319223176264031724 | 38319223176264031724 | 83192   | 1 | 23.1000 | 317   | 2    | ECERT  | US    | 2016-09-20 00:00:00.000 | 124  | 2016-09-19 00:00:00.000 | 
+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 
| 1 | 28319219766306010024 | 28319219766306010024 | 83192   | 1 | 19.7000 | 100   | 2    | ECERT  | EU    | 2016-11-01 00:00:00.000 | 124  | 2016-10-31 00:00:00.000 | 
+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 
| 1 | 28319219766306010024 | 28319219766306010024 | 83192   | 1 | 19.7000 | 100   | 2    | ECERT  | US    | 2016-11-01 00:00:00.000 | 124  | 2016-10-31 00:00:00.000 | 
+-----+----------------------+----------------------+-----------------+-----+-----------+--------------+-----------------+--------------+----------------+-------------------------+---------+-------------------------+ 

힌트 :<Markets>1:n - 관련이 없으면 (결과가 두 배가됩니다!) CROSS APPLYm.value으로 시작하는 줄을 제거하면됩니다.

+0

고마워요. 나는 이것도 잘 주겠다. 정말로 시간과 노력에 감사한다. :) – Harry

관련 문제