XML to SQL 2008r2 issue



由于某种原因,当我运行下面显示的代码时,我无法区分,它没有给我正确的"DE"值,而是重复了"00"的第一个值。 这仅在最后一列中发生。 有什么想法我哪里出错了吗?

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

这应该有效

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) '.'
)

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

最新更新