【问题标题】:How to parse xml in sql server to process NULL value in DateTime DataType如何在 sql server 中解析 xml 以处理 DateTime DataType 中的 NULL 值
【发布时间】:2010-05-14 04:58:45
【问题描述】:

我在 sql server 中创建了一个示例查询来解析 xml 中的数据并立即显示它。 虽然我将在我的表中插入这些数据,但在此之前我面临一个简单的问题。

我想在日期时间字段ADDED_DATE="NULL" 中插入NULL,如下面的xml 所示。但是当我执行这个查询时。它给了我错误

从字符串转换日期时间时转换失败。

我做错了什么。请指出我的错误。

declare @xml varchar(1000)
set @xml= '
<ROOT>
    <TX_MAP FK_GUEST_ID="1"  FK_CATEGORY_ID="2" ATTRIBUTE="Test" DESCRIPTION="TestDesc" IS_ACTIVE="1" ADDED_BY="NULL" ADDED_DATE="NULL" MODIFIED_BY="NULL" MODIFIED_DATE="NULL"></TX_MAP>
    <TX_MAP FK_GUEST_ID="2"  FK_CATEGORY_ID="1" ATTRIBUTE="Test2" DESCRIPTION="TestDesc2" IS_ACTIVE="1" ADDED_BY="NULL" ADDED_DATE="NULL" MODIFIED_BY="NULL" MODIFIED_DATE="NULL"></TX_MAP>
</ROOT> '

declare @handle int
exec sp_xml_preparedocument @handle output, @xml

select * from OPENXML(@handle,'/ROOT/TX_MAP',1)
with 
    (
    FK_GUEST_ID INT
    ,FK_CATEGORY_ID VARCHAR(10)
    ,ATTRIBUTE VARCHAR(100)
    ,[DESCRIPTION] VARCHAR(100)
    ,IS_ACTIVE VARCHAR(10)
    ,ADDED_BY VARCHAR(100)
    ,ADDED_DATE DATETIME NULL
    ,MODIFIED_BY VARCHAR(100)
    ,MODIFIED_DATE DATETIME NULL
    )

我使用的是 Sql Server 2005。

【问题讨论】:

  • 既然您使用的是 SQL Server 2005,为什么不使用“XML”数据类型呢?
  • @John:我已经创建了表,我将在其中插入这些数据。我试图避免在前端运行事务。这就是为什么。在这里,我只是提供了 select 的示例查询,否则我将为 insert 执行此操作
  • 这仍然没有说明您为什么不使用 XML 数据类型。更改列的数据类型有多难?

标签: sql-server xml tsql sql


【解决方案1】:

在谷歌上搜索了一个小时后,我得到了我的问题的答案,并想与大家分享,以便未来的用户可以轻松使用。

declare @xml varchar(1000)
set @xml= '
<ROOT>
    <TX_MAP FK_GUEST_ID="1"  FK_CATEGORY_ID="2" ATTRIBUTE="Test" DESCRIPTION="TestDesc" IS_ACTIVE="1" ADDED_BY="NULL" ADDED_DATE="12/3/2010" MODIFIED_BY="NULL" MODIFIED_DATE="12/3/2010"></TX_MAP>
    <TX_MAP FK_GUEST_ID="2"  FK_CATEGORY_ID="1" ATTRIBUTE="Test2" DESCRIPTION="TestDesc2" IS_ACTIVE="1" ></TX_MAP>
</ROOT> '

declare @handle int
exec sp_xml_preparedocument @handle output, @xml

select * from OPENXML(@handle,'/ROOT/TX_MAP',1)
with 
    (
    FK_GUEST_ID INT
    ,FK_CATEGORY_ID VARCHAR(10)
    ,ATTRIBUTE VARCHAR(100)
    ,[DESCRIPTION] VARCHAR(100)
    ,IS_ACTIVE VARCHAR(10)
    ,ADDED_BY VARCHAR(100)
    ,ADDED_DATE DATETIME
    ,MODIFIED_BY VARCHAR(100)
    ,MODIFIED_DATE DATETIME 
    )

你需要做的只是省略 那些将导致 NULL 值

【讨论】:

    【解决方案2】:

    可以将 XML 元素设置为null,例如:

    <ADDED_DATE xsi:nil="true"/>
    

    我找不到将 属性 设置为 null 的方法。也许唯一的方法就是省略它?

    【讨论】:

    • 如果他将该属性更改为一个元素,我认为即使没有零也可以工作,只需 NULL
    • 使用元素代替属性会使它看起来更长,这就是我试图避免的原因。但如果我找不到其他选择,那么这将是我最后的选择。
    猜你喜欢
    • 2021-04-06
    • 2021-08-05
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2013-01-18
    相关资源
    最近更新 更多