我有一个破坏查询的空实例
...
<publicationreference>
...
<referencedpublicationid />
在查询包含之前:
reference.value(
'./referencedpublicationid[1]','uniqueidentifier')
AS [referencedpublicationid],
导致错误。
包含修复查询后:
reference.value(
'(./Field[@fieldName="referencedpublicationid"]/text())[1]','uniqueidentifier')
AS [referencedpublicationid],
导致<referencedpublicationid xsi:nil="true" />
有人可以解释这些行有何不同?
答案 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
的结果。