Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果表节点存在,SQL XML.node.query()将返回空字符串而不是NULL_Sql_Sql Server_Xml_Xml Parsing - Fatal编程技术网

如果表节点存在,SQL XML.node.query()将返回空字符串而不是NULL

如果表节点存在,SQL XML.node.query()将返回空字符串而不是NULL,sql,sql-server,xml,xml-parsing,Sql,Sql Server,Xml,Xml Parsing,如果表不存在,为什么.query()返回空字符串而不是NULL?我不熟悉用SQL查询xml,所以我只是随便玩玩,这是出乎意料的 下面是一个问题的例子 declare @xml xml set @xml = N'<xdoc><Header><OrderID>1234</OrderID><Detail><ProductID>12345</ProductID><Amount>12.50</Amoun

如果表不存在,为什么.query()返回空字符串而不是NULL?我不熟悉用SQL查询xml,所以我只是随便玩玩,这是出乎意料的

下面是一个问题的例子

declare @xml xml

set @xml = N'<xdoc><Header><OrderID>1234</OrderID><Detail><ProductID>12345</ProductID><Amount>12.50</Amount></Detail></Header></xdoc>'

SELECT  
    Tbl.Col.value('OrderID[1]', 'varchar(10)') as OrderID,  
    Tbl.Col.query('Detail') as Detail
FROM @xml.nodes('//Header') Tbl(Col)

set @xml = N'<xdoc><Header><OrderID>1234</OrderID></Header></xdoc>'

SELECT  
    Tbl.Col.value('OrderID[1]', 'varchar(10)') as OrderID,  
    Tbl.Col.query('Detail') as Detail
FROM @xml.nodes('//Header') Tbl(Col)
declare@xml

设置@xml=N'123412345

您想要的是可能的,但您必须有一点不同的想法。在XML中,值
NULL
缺少的节点表示

此外,“value”这个词在这个句子中非常重要。如果要查找的元素不存在,
.value()
方法将返回
NULL
.query()
-方法在任何情况下都将返回XML类型的片段

XML由节点组成。元素(任何
以及所有嵌套节点)是一种特殊类型的节点。元素中的浮动文本本身就是一个节点。看看这些例子:

您的XML

declare @xml xml

set @xml = 
N'<xdoc>
  <Header>
    <OrderID>1234</OrderID>
    <Detail>
      <ProductID>12345</ProductID>
      <Amount>12.50</Amount>
    </Detail>
  </Header>
</xdoc>'
--此节点不存在。返回的不是
NULL
-value
,而是空XML节点

SELECT @xml.query('/xdoc/Header/Dummy');                                       --<-- empty XML
第一个调用是明确的,没有
,因此,我们得到一个
NULL
返回。
第二个电话可能会让你大吃一惊。该值为元素中的所有内容。在这种情况下,我们得到所有值的组合。您可能会认为这是模拟group_concat()的一个技巧。
第三个调用返回
NULL
,因为

... 第四个和第五个调用返回相同的结果,但最后一个带有
text()
的调用是最具体的,因此是最佳选择


这取决于你的需求、你想查询什么以及你想得到什么。此外,您可以在XPath中使用诸如
empty(SomeNode)
not(empty(SomeNode))
之类的谓词来使用XQuery筛选器。

XML支持是高度特定于供应商的-因此请添加一个标记来指定您是否在使用
mysql
postgresql
sql server
oracle
db2
-或其他完全不同的东西。
query
方法通常实现
XQuery
规范的[一部分],该规范没有空的概念。该方法仅在应用于null sql xml值(sql server)时返回null。
SELECT @xml.query('/xdoc/Header/Dummy');                                       --<-- empty XML
SELECT @xml.value('(/xdoc/Header/Dummy)[1]','nvarchar(100)');                  --<-- NULL
SELECT @xml.value('(/xdoc/Header/Detail)[1]','nvarchar(100)');                 --<-- 1234512.50
SELECT @xml.value('(/xdoc/Header/Detail/text())[1]','nvarchar(100)');          --<-- NULL
SELECT @xml.value('(/xdoc/Header/Detail/ProductID)[1]','nvarchar(100)');       --<-- 12345
SELECT @xml.value('(/xdoc/Header/Detail/ProductID/text())[1]','nvarchar(100)');--<-- 12345