Sql server TSQL中的XML解析提供无效列错误?

Sql server TSQL中的XML解析提供无效列错误?,sql-server,xml,tsql,xml-parsing,Sql Server,Xml,Tsql,Xml Parsing,我试图解析一个简单的XML文件。只要我取消对insert语句的注释,它就会给出无效的列错误 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>

我试图解析一个简单的XML文件。只要我取消对insert语句的注释,它就会给出无效的列错误

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

有时你使用像L_ATTR和R_ATTR这样的东西,而其他时候你使用像L_ATT和R_ATT这样没有Rs的东西。选择一个并坚持它


提到无效列的错误消息试图告诉您:您尝试从TEMP中选择的列无效,因为您使用的名称与创建TEMP时的名称不同。

为什么不这样做

-- 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

这只是解析XML比您的方法简单得多!然后一次性将L_ATTR_CD、L_ATTR_CD_值以及R_ATTR_CD、R_ATTR_CD_值对插入临时表。

这是一个现有过程。我正在试着调试它。我知道它让人困惑,但它的使用是正确的,因为我从昨天开始一直在修复它,但没有成功。我不是这个程序的所有者。我只是想调试一下。我想他们两人一组是为了满足一些报告要求。我不确定如何过滤掉空的或空的values@sanika当前位置如果这个答案有效,并帮助你解决问题,那么正确而礼貌的做法是鼓励他人在将来帮助你。
     select * from #TEMP_T
        select * from #TEMP 
-- 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