sanika
sanika

Reputation: 79

XML Parsing in TSQL gives invalid column error?

I am trying to parse a simple XML file. As soon as I un comment the insert statement it gives me invalid column errors.

drop table #TEMP
drop table #TEMP_T

declare @XMl_DATA AS XML
set @XMl_DATA =
'<DocumentElement>
  <Att_Table>
    <L_ATTR_CD>GAS_FLOW_START_DATE</L_ATTR_CD>
    <L_ATTR_DESC>GAS FLOW START DATE</L_ATTR_DESC>
    <L_ATTR_VALUE>01/01/2012</L_ATTR_VALUE>
    <R_ATTR_CD>EX_CTRCT_CO_ID</R_ATTR_CD>
    <R_ATTR_DESC>EXCLUDE GID(S)</R_ATTR_DESC>
    <R_ATTR_VALUE />
  </Att_Table>
  <Att_Table>
    <L_ATTR_CD>GAS_FLOW_END_DATE</L_ATTR_CD>
    <L_ATTR_DESC>GAS FLOW END DATE</L_ATTR_DESC>
    <L_ATTR_VALUE>01/31/2012</L_ATTR_VALUE>
    <R_ATTR_CD>EX_CTRCT_NBR</R_ATTR_CD>
    <R_ATTR_DESC>EXCLUDE CONTRACT NUMBER(S)</R_ATTR_DESC>
    <R_ATTR_VALUE />
  </Att_Table>
  <Att_Table>
    <L_ATTR_CD>CTRCT_CO_ID</L_ATTR_CD>
    <L_ATTR_DESC>GID(S)</L_ATTR_DESC>
    <L_ATTR_VALUE />
    <R_ATTR_CD>EX_RATE_CMPNT_CD</R_ATTR_CD>
    <R_ATTR_DESC>EXCLUDE RATE COMPONENT CODE(S)</R_ATTR_DESC>
    <R_ATTR_VALUE />
  </Att_Table>
  <Att_Table>
    <L_ATTR_CD>CTRCT_NBR</L_ATTR_CD>
    <L_ATTR_DESC>DART STYLE CONTRACT NUMBER(S)</L_ATTR_DESC>
    <L_ATTR_VALUE />
    <R_ATTR_CD>EX_PT_ID_NBR</R_ATTR_CD>
    <R_ATTR_DESC>EXCLIDE POINT ID NUMBER(S)</R_ATTR_DESC>
    <R_ATTR_VALUE />
  </Att_Table>
  </DocumentElement>'

Temp table:

CREATE TABLE #TEMP_T 
    (
        ID INT IDENTITY(1,1), 
        ATT_CD VARCHAR(50), 
        ATT_CD_VALUE VARCHAR(1000)
    )

SELECT 
    cast(Colx.query('data(L_ATTR_CD)') as varchar(max))as L_ATTR_CD,
    cast(Colx.query('data(L_ATTR_VALUE)') as varchar(max))as L_ATTR_CD_VALUE,
    cast(Colx.query('data(R_ATTR_CD)') as varchar(max)) as R_ATTR_CD,
    cast(Colx.query('data(R_ATTR_VALUE)') as varchar(max))as R_ATTR_CD_VALUE
    INTO #TEMP 
    FROM @XMl_DATA.nodes('DocumentElement/Att_Table') AS T(Colx)

    --INSERT INTO #TEMP_T(ATT_CD,ATT_CD_VALUE)
    --SELECT LTRIM(RTRIM(L_ATT_CD)),LTRIM(RTRIM(L_ATT_CD_VALUE)) 
    --FROM #TEMP 
    --WHERE L_ATT_CD_VALUE <> 'NO_DATA'


    --INSERT INTO #TEMP_T(ATT_CD,ATT_CD_VALUE)
    --SELECT LTRIM(RTRIM(R_ATT_CD)),LTRIM(RTRIM(R_ATT_CD_VALUE)) 
    --FROM #TEMP 
    --WHERE R_ATT_CD_VALUE <>'NO_DATA'

Output:

     select * from #TEMP_T
        select * from #TEMP 

Upvotes: 3

Views: 268

Answers (2)

marc_s
marc_s

Reputation: 755541

Why don't you just do something like this?

-- define your XML structure and create the #TEMP_T table

;WITH ParsedData AS 
(
    SELECT
        Colx.value('(L_ATTR_CD)[1]', 'varchar(50)') as L_ATTR_CD,
        Colx.value('(L_ATTR_VALUE)[1]', 'varchar(50)') as L_ATTR_CD_VALUE,
        Colx.value('(R_ATTR_CD)[1]', 'varchar(50)') as R_ATTR_CD,
        Colx.value('(R_ATTR_VALUE)[1]', 'varchar(50)') as R_ATTR_CD_VALUE
    FROM 
        @XMl_DATA.nodes('DocumentElement/Att_Table') AS T(Colx)
)
INSERT INTO #temp_T(ATT_CD, ATT_CD_VALUE)
    SELECT L_ATTR_CD, L_ATTR_CD_VALUE
    FROM parseddata
    UNION
    SELECT R_ATTR_CD, R_ATTR_CD_VALUE
    FROM parseddata

This just parses the XML (much simpler than your approach, too!) and then inserts both the (L_ATTR_CD, L_ATTR_CD_VALUE) as well as the (R_ATTR_CD, R_ATTR_CD_VALUE) pairs into the temp table in a single go.

Upvotes: 0

AakashM
AakashM

Reputation: 63396

Sometimes you use things like L_ATTR and R_ATTR, and other times you use things like L_ATT and R_ATT (with no Rs). Pick one and stick to it.

The error message mentioning "invalid column" was trying to tell you this: the columns you try to select from #TEMP are "invalid" because you aren't using the same names as when you created #TEMP.

Upvotes: 1

Related Questions