【问题标题】:XML Parsing in TSQL gives invalid column error?TSQL 中的 XML 解析给出了无效的列错误?
【发布时间】:2012-08-10 22:55:30
【问题描述】:

我正在尝试解析一个简单的 XML 文件。一旦我取消注释插入语句,它就会给我无效的列错误。

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

临时表:

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'

输出:

     select * from #TEMP_T
        select * from #TEMP 

【问题讨论】:

    标签: sql-server xml tsql xml-parsing


    【解决方案1】:

    有时您使用L_ATTRR_ATTR 之类的东西,而其他时候您使用L_ATTR_ATT 之类的东西(没有Rs)。选择一个并坚持下去。

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

    【讨论】:

    • 这是一个现有的过程。我正在尝试调试它。我知道它令人困惑,但它使用正确,因为我从昨天开始一直在努力解决这个问题,但没有任何成功
    【解决方案2】:

    你为什么不做这样的事情?

    -- 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_VALUE) 和 (R_ATTR_CD, R_ATTR_CD_VALUE) 对插入到临时表中。

    【讨论】:

    • 我不是这个过程的所有者。我只是想调试它。我认为他们有一些报告要求。我不确定
    • 如何过滤掉空值或空值
    • @sanika:如果这个答案有效,并且帮助你解决了你的问题,正确和礼貌的做法是accept the answer,以鼓励其他人在未来帮助你。
    猜你喜欢
    • 2010-11-21
    • 2016-08-10
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-01-24
    相关资源
    最近更新 更多