从XML变量

时间:2017-05-29 15:33:18

标签: xml tsql

从空XML节点中选择null的最佳方法是什么?

E.g。

DECLARE @xml xml = N'<t />'
SELECT @xml.value('(t)[1]','int')

这将返回0而不是NULL。为什么?如何提取null?

2 个答案:

答案 0 :(得分:3)

空元素没有text()。试试这个:

DECLARE @xml xml = N'<t />'
SELECT @xml.value('(t/text())[1]','int');

更新一些解释

XML为每种数据类型使用定义的字符串格式。您肯定知道,INT不是存储为数字链,而是存储在内部的二进制值。您在结果集中看到的内容以及为XML生成的内容是人类读者遵循某些规则以确保正确阅读的字符串表示。日期和时间值应为ISO8601,BLOB将转换为base64,依此类推......

每种数据类型都有一个默认值,INT0。试试这个,没有XML也是一样:

SELECT CAST('' AS INT)     --returns 0
      ,CAST(NULL AS INT)   --returns NULL

XML中没有NULL值(嗯,您可以指定XSINIL来使用标记属性),但元素可能会丢失。只有缺失的元素才会被读为NULL ...

查看this answer,了解有关NULLempty的一些示例。查看this answer以了解有关text()

的更多信息

答案 1 :(得分:0)

我也发现了这个功能:

DECLARE @xml xml = N'<t />'
SELECT @xml.query('/t').value('number(.)','int')

但是我想知道是否有,没有使用内部功能的方法。也许是一些命名空间。