如何将 DateTime 的 SQL Server XML 类型值 (xsi:nil) 转换为 null

Posted

技术标签:

【中文标题】如何将 DateTime 的 SQL Server XML 类型值 (xsi:nil) 转换为 null【英文标题】:How to convert SQL Server XML type value (xsi:nil) of DateTime to null 【发布时间】:2009-07-29 19:27:43 【问题描述】:

有没有办法查询 SQL Server XML 类型,以便对于 xsi:nil="true" 的元素,返回 null 而不是默认日期时间值,即 1900-01-01 00:00:00.000

这是一个代码sn-p

declare @data xml
set @data = 
    '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:nil="true" />'
select  Value1 = @data.value('/DOD[1]', 'datetime'),
        Value2 = IsNull(@data.value('/DOD[1]', 'datetime'), 'NOT NULL?'),
        Value3 = nullif(@data.value('/DOD[1]', 'datetime'), '1900-01-01')

Value1 和 Value2 都返回 1900-01-01 00:00:00.000。 有没有办法返回一个空值,而不是?不使用nullif

【问题讨论】:

提问时请多注意标签提示。站点上有 6810 个标记为“sql-server”的问题,没有一个标记为“sqlserver” @Joel:哇,将 sqlserver 标记转换为 sql-server 非常棒。下次我会小心点的~ 【参考方案1】:

“默认”日期时间是由一个空字符串“零”引起的,它给出了 1900 年 1 月 1 日。

所以:整理字符串,然后 CAST

declare @data xml

set @data = 
        '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xsi:nil="true" />'

select
    Value1 = CAST(NULLIF(@data.value('/DOD[1]', 'varchar(30)'), '') AS datetime)

【讨论】:

我认为您的方法看起来比我尝试做的更好,即 ------ nullif(@data.value('string(/DOD[1]/@xsi:nil ="true")', 'varchar(4)'), 'true') 这对我有用 - 我的 sql 数据类型是 datetime CAST(NULLIF(@data.value('/DOD[1]', 'datetime'), '') AS datetime)【参考方案2】:

简单:

declare @data xml

set @data = 
        '<DOD   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xsi:nil="true" />'

select
    Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)')

【讨论】:

我在 SO 的其他地方读到,选择 text() 节点(而不是元素节点)也可以提高性能!请注意,即使没有 xsi:nil="true"; ,选择 text() 也会返回 NULL;包括带有显式结束标记的空元素也将变为 NULL。但是......如果你想提供一个空(零长度)字符串怎么办?嗯。【参考方案3】:

我知道这个线程已经死了一段时间,但我认为这种方式更简单一些:

SELECT value1 = NULLIF(@data.value('/DOD[1]', 'datetime'), '')

首先计算xml字符串中的字符串值,如果它为空,将成为空日期时间。

【讨论】:

【参考方案4】:

您也可以像这样显式检查 nil:

declare @data xml

set @data = '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />'

select Value1 = @data.value('(/DOD[not(@xsi:nil eq "true")])[1]', 'datetime')

【讨论】:

【参考方案5】:

这种情况可能并不适合每个人

这样做的一个聪明方法是从 XML 中删除 DOD 节点。因此,您希望结果集中的任何节点都为空,只需在将其添加到 XML 时删除该节点即可。

所以下面也会产生一个空值:

declare @data xml

set @data = '<Test> </Test>'

select  Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)')

从上面的例子可以看出,没有DOD节点,所以会产生一个空值

【讨论】:

以上是关于如何将 DateTime 的 SQL Server XML 类型值 (xsi:nil) 转换为 null的主要内容,如果未能解决你的问题,请参考以下文章

SQL server v17:如何将 smalldatetime 值转换为 datetime

如何将当前日期和时间插入到具有 DateTime 类型列的 SQL Server 表中?

如何将 DateTime 的 SQL Server XML 类型值 (xsi:nil) 转换为 null

C# 将 DateTime 转换为 Sql Server 2005 格式

如何在SQL Server中将datetime值转换为yyyymmddhhmmss?

如何在忽略时区问题的情况下从 SQL Server 获取 DateTime 数据?