代码之家  ›  专栏  ›  技术社区  ›  Pixelated

SQL Server 2008-将XML分解到表中需要将未知日期值保持为NULL

  •  1
  • Pixelated  · 技术社区  · 16 年前

    我在想是否有人能帮忙

    在SQLServer2008中,我成功地将XML文档导入到具有XML数据类型的表中,但是当我尝试将该表分解到暂存表时,没有输入日期的任何日期值都会作为1900-01-01插入到暂存表中。

    有没有一个切割器的方式,我错过了阻止它这样做,只是插入空而不是。我可以在staging表上使用NULLIF并用null替换1900-01-01,但是我不愿意这样做,以防有真正的1900-01-01值。

    我的代码看起来像这样

    SELECT tab.col.value('LastDate[1]','DATE') LastARD'
    
    FROM   import.XMLCompanyDetail
    
     CROSS APPLY
              xmldata.nodes('//VN/CompanyList/Row') AS tab(col)
    

    非常感谢

    请看下面我导入的XML示例

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <VN>
    <CompanyList>
    <Row num="1"><CoNum>7878</CoNum><CoName>ExampleName</CoName><DInc>1978-12-30</DInc><DDis></DDis></Row>
    </CompanyList>
    </VN>
    

    日期DDIS应该是空的,但是当它导入到我的暂存表时,它会插入1901-01-01。

    更新了代码来说明我的意思

    create table staging_table
    (DInc DATE NULL, LastARD DATE NULL);
    
    with XMLCompanyDetail as 
    (
    SELECT CAST('<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <VN>
    <CompanyList>
    <Row num="1"><CoNum>7878</CoNum><CoName>ExampleName</CoName><DInc>1978-12-30</DInc><DDis></DDis></Row> 
    </CompanyList>
    </VN>
    ' AS XML) AS xmldata
    )
    
    INSERT INTO Staging_Table
    SELECT tab.col.value('DInc[1]','DATE') DInc,
    tab.col.value('DDis[1]','DATE') LastARD
    FROM XMLCompanyDetail
    CROSS APPLY
    xmldata.nodes('//VN/CompanyList/Row') AS tab(col)
    
    SELECT * FROM Staging_table
    drop table staging_table
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Martin Smith    16 年前

    编辑

    SELECT tab.col.value('DInc[1][. != '''']','DATE') DInc,
    tab.col.value('DDis[1][. != '''']','DATE') LastARD
    FROM XMLCompanyDetail
    CROSS APPLY
    xmldata.nodes('//VN/CompanyList/Row') AS tab(col)
    
        2
  •  1
  •   Denis Valeev    16 年前

    尝试使用 datetime

    declare @xml xml
    set @xml = ''
    
    select @xml.value('LastDate[1]','datetime') 
    

    等等,这个回来了 null . 这意味着,一旦插入到您的暂存表 无效的 值被该暂存表中的默认设置覆盖。所以,如果你不想发生这种行为,就把它去掉。