SQL Server查询空xml元素值

时间:2014-11-17 07:49:24

标签: sql-server tsql xquery

我有一个破坏查询的空实例

...
<publicationreference>
  ...
  <referencedpublicationid />

在查询包含之前:

reference.value(
  './referencedpublicationid[1]','uniqueidentifier') 
  AS [referencedpublicationid],

导致错误。

包含修复查询后:

reference.value(
  '(./Field[@fieldName="referencedpublicationid"]/text())[1]','uniqueidentifier') 
  AS [referencedpublicationid],

导致<referencedpublicationid xsi:nil="true" />

有人可以解释这些行有何不同?

1 个答案:

答案 0 :(得分:1)

看起来您的两个查询针对不同的XML源。在第一个中,您将referencedpublicationid作为元素名称,在第二个中,您将其作为名为@fieldName的属性。我也很难理解生成的XML与此有什么关系。使用xsi:nil="true"创建XML时会生成for xml path, elements xsinil

我会尝试解决我认为你所看到的问题。

试试这段代码:

declare @XML xml = '<referencedpublicationid />'
select @XML.value('./referencedpublicationid[1]', 'nvarchar(50)')
select @XML.value('(./referencedpublicationid/text())[1]', 'nvarchar(50)')

第一个查询返回一个空字符串,第二个返回NULL

如果您改为指定数据类型uniqueidentifier,则第一个将失败,因为您无法将空字符串强制转换为uniqueidentifier。第二个转换为罚款,因为它是NULL

SQL Server中无类型XML中的所有值都是字符串,然后在values函数中转换为指定的数据类型。

当您使用./referencedpublicationid[1]时,您将获得所有子text()值的连接值。 SQL Server由于某种原因在没有找到text()个节点时为您提供空字符串。

此表达式(./referencedpublicationid/text())[1]指定referencedpublicationid中的第一个text()节点,由于没有,您将获得NULL的结果。