2016-02-04 5 views
2

По какой-то причине я не могу различить, когда я запускаю код, показанный ниже, вместо того, чтобы давать мне правильное значение «DE», он повторяет первое значение «00». Это происходит только в последнем столбце. Любые идеи, в которых я ошибся?Проблема с XML-SQL 2008r2

USE EDIXML 
GO 
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) 
SELECT @XML = XMLData FROM XMLwithOpenXML 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 
SELECT code,type,name,DE 
FROM OPENXML(@hDoc, 'TRN-862/SEG-BSS/DE') 
WITH 
(
code [varchar](100) '@code', 
type [varchar](100) '@type', 
name [varchar](100) '@name', 
DE [varchar](100) '../DE' 
) 
EXEC sp_xml_removedocument @hDoc 
GO 

Ниже XML данные:

<TRN-862> 
    <SEG-BSS> 
    <SEG-INFO code="BSS" name="BEGINNING SEGMENT FOR SHIPPING SCHEDULE" /> 
    <DE code="0353" name="TRANSACTION SET PURPOSE CODE" type="ID" desc="Original">00</DE> 
    <DE code="0127" name="REFERENCE IDENTIFICATION" type="AN">512</DE> 
    <DE code="0373" name="DATE" type="DT">20160204</DE> 
    <DE code="0675" name="SCHEDULE TYPE QUALIFIER" type="ID" desc="Shipment Based">SH</DE> 
    <DE code="0373" name="DATE" type="DT">20160204</DE> 
    <DE code="0373" name="DATE" type="DT">20160227</DE> 
    <DE code="0328" name="RELEASE NUMBER" type="AN">512</DE> 
    <DE code="0127" name="REFERENCE IDENTIFICATION" type="AN" /> 
    <DE code="0367" name="CONTRACT NUMBER" type="AN" /> 
    <DE code="0324" name="PURCHASE ORDER NUMBER" type="AN" /> 
    <DE code="0676" name="SCHEDULE QUANTITY QUALIFIER" type="ID" desc="Actual Discrete Quantities">A</DE> 
    </SEG-BSS> 

И, наконец, ниже, что запрос обеспечивает:

code type name DE 
0353 ID TRANSACTION SET PURPOSE CODE 00 
0127 AN REFERENCE IDENTIFICATION 00 
0373 DT DATE 00 
0675 ID SCHEDULE TYPE QUALIFIER 00 
0373 DT DATE 00 
0373 DT DATE 00 
0328 AN RELEASE NUMBER 00 
0127 AN REFERENCE IDENTIFICATION 00 
0367 AN CONTRACT NUMBER 00 
0324 AN PURCHASE ORDER NUMBER 00 
0676 ID SCHEDULE QUANTITY QUALIFIER 00 

ответ

1

это должно работать

EXEC sp_xml_preparedocument 
    @hDoc OUTPUT, 
    @XML; 
SELECT code, 
     type, 
     name, 
     DE 
FROM OPENXML(@hDoc, 'TRN-862/SEG-BSS/DE') 
WITH(
code [VARCHAR](100) '@code', 
type [VARCHAR](100) '@type', 
name [VARCHAR](100) '@name', 
DE [VARCHAR](100) '.' 
) 
+0

Brilliant! Огромное спасибо! – Launenhaft

1

OPENXML устарела , Вы должны использовать "реальную" методу XML, как этот

DECLARE @xml XML= 
'<TRN-862> 
    <SEG-BSS> 
    <SEG-INFO code="BSS" name="BEGINNING SEGMENT FOR SHIPPING SCHEDULE" /> 
    <DE code="0353" name="TRANSACTION SET PURPOSE CODE" type="ID" desc="Original">00</DE> 
    <DE code="0127" name="REFERENCE IDENTIFICATION" type="AN">512</DE> 
    <DE code="0373" name="DATE" type="DT">20160204</DE> 
    <DE code="0675" name="SCHEDULE TYPE QUALIFIER" type="ID" desc="Shipment Based">SH</DE> 
    <DE code="0373" name="DATE" type="DT">20160204</DE> 
    <DE code="0373" name="DATE" type="DT">20160227</DE> 
    <DE code="0328" name="RELEASE NUMBER" type="AN">512</DE> 
    <DE code="0127" name="REFERENCE IDENTIFICATION" type="AN" /> 
    <DE code="0367" name="CONTRACT NUMBER" type="AN" /> 
    <DE code="0324" name="PURCHASE ORDER NUMBER" type="AN" /> 
    <DE code="0676" name="SCHEDULE QUANTITY QUALIFIER" type="ID" desc="Actual Discrete Quantities">A</DE> 
    </SEG-BSS> 
</TRN-862>'; 

    SELECT DE.value('@code','varchar(max)') AS code 
     ,DE.value('@type','varchar(max)') AS type 
     ,DE.value('@name','varchar(max)') AS name 
     ,DE.value('.','varchar(max)') AS DE 
    FROM @xml.nodes('/TRN-862/SEG-BSS/DE') AS One(DE) 

Результат

code type name       DE 
0353 ID  TRANSACTION SET PURPOSE CODE 00 
0127 AN  REFERENCE IDENTIFICATION  512 
0373 DT  DATE       20160204 
0675 ID  SCHEDULE TYPE QUALIFIER   SH 
0373 DT  DATE       20160204 
0373 DT  DATE       20160227 
0328 AN  RELEASE NUMBER     512 
0127 AN  REFERENCE IDENTIFICATION  
0367 AN  CONTRACT NUMBER 
0324 AN  PURCHASE ORDER NUMBER 
0676 ID  SCHEDULE QUANTITY QUALIFIER  A 
Смежные вопросы