如何将 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 格式