【问题标题】:What is the meaning of FOR XML PATH(' ')? [closed]FOR XML PATH(' ') 是什么意思? [关闭]
【发布时间】:2016-05-06 13:13:46
【问题描述】:

是什么意思

FOR XML PATH('')?

它代表什么。因为它没有根节点。

【问题讨论】:

  • 你看过MSDN上的相关文档吗?如果是这样,您对哪个特定部分有理解困难?
  • 这个问题没有显示任何研究工作。
  • @MartinSmith 好吧,T-SQL 书中的for xml 文档是一个好的开始:)
  • @Luaan - 我快速浏览了msdn.microsoft.com/en-GB/library/ms178107.aspx 并没有看到任何提及但看到你找到了一些。
  • 如果你在问之前用谷歌搜索过,你应该提到你发现你不明白的地方。如果你没有,那么,你会感到羞耻。

标签: sql sql-server for-xml-path


【解决方案1】:

似乎对“根”和“元素”有些混淆。在 XML 中,根是树顶部的单个节点。

如果我们指定 FOR XML PATH 之后没有任何内容,那么我们会得到一组名为“Row”的 XML 元素。这是默认名称。

USE AdventureWorks2016CTP3;
GO

SELECT BusinessEntityID, FirstName, LastName
    FROM Person.Person
    WHERE BusinessEntityID BETWEEN 14500 AND 14502
    FOR XML PATH;

我们可以像这样为封闭的 XML 元素指定一个不同的名称。

SELECT BusinessEntityID, FirstName, LastName
    FROM Person.Person
    WHERE BusinessEntityID BETWEEN 14500 AND 14502
    FOR XML PATH('Person');

如果我们希望 XML 元素包含在顶级根元素中,我们可以这样指定。

SELECT BusinessEntityID, FirstName, LastName
    FROM Person.Person
    WHERE BusinessEntityID BETWEEN 14500 AND 14502
    FOR XML PATH('Person'),
    ROOT('People');

为元素名称指定一个空字符串会导致它忽略封闭的 XML 元素。这似乎是一件很奇怪的事情。我无法想象为什么有人愿意这样做。

SELECT BusinessEntityID, FirstName, LastName
    FROM Person.Person
    WHERE BusinessEntityID BETWEEN 14500 AND 14502
    FOR XML PATH('');

但是 Books Online 确实说这是正确的行为。请参阅 FOR XML 子句的基本语法 > https://msdn.microsoft.com/en-gb/library/ms190922.aspx > 参数 > PATH。

如果您提供空字符串(FOR XML PATH ('')),则不会生成包装元素。

【讨论】:

  • 惊人的答案。非常感谢..!!
  • 不客气! FOR XML 相当复杂,但最终还是有意义的。
【解决方案2】:

来自MSDN

如果指定长度为零的字符串,则不会生成环绕元素。

' ' 失败,所以我假设您的意思是一个空字符串,而不是一个空格)。

这与根元素无关,这就是root 的用途。这只是关于 wrapping 元素。

【讨论】:

  • 感谢您的回答。我找不到任何关于此的事情,因此在这里问了这个问题。如果 XML 没有根节点,这样做有什么用?
  • @NimbleFungus - 我看到它最常使用的用例是字符串连接以及未命名列的行为。例如SELECT (select name + ',' FROM sys.all_columns FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)')
  • @MartinSmith 非常感谢马丁。
  • @NimbleFungus 同样,这与根节点无关 - 仅与包装元素有关。在某些情况下,您不想将行包装在它们自己的元素中 - 我链接的文章中有一个示例(使用 PATH 模式生成值列表)。
  • @MartinSmith 我现在明白你的意思了:D
猜你喜欢
  • 2014-03-04
  • 2011-07-05
  • 2013-10-13
  • 1970-01-01
  • 2010-12-29
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多