【问题标题】:How FOR XML Works in SQL ServerFOR XML 在 SQL Server 中的工作原理
【发布时间】:2015-01-21 20:41:34
【问题描述】:

有人能解释一下 SQL Server 中如何使用 FOR XML 吗?这是在不使用用户定义函数的情况下按行连接字符串的唯一方法吗?我从这个post 得到它,做了我需要做的事情,但我不明白。

发布此消息的人没有解释任何事情。经过一个详尽的 搜索我找不到任何可以理解的东西。不,鉴于我有限的 SQL 技能,MSDN 没有帮助。

这是我的 SQL,只是名称与该帖子中的名称不同。

SELECT 
  ID,
  STUFF((
    SELECT ' -' + Code
    FROM #Z 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)'),1,2,''
 ) AS ConcatCode
FROM #Z Results
GROUP BY ID

【问题讨论】:

  • MSDN 的documentation 似乎很清楚。使用PATH模式here更加清晰。
  • FOR XML XPATH 的特殊用法是 hacks 在 Sql Server 中执行 GROUP_CONCAT 或 ListAgg 的一种。
  • 好吧,我不了解属性、元素或 XPath 表达式。这听起来更像是 HTML 术语。
  • XMLHTML 非常相似;它们都使用属性、元素,并且可以针对它们运行 XPath 查询。您希望我们在这里为您解答什么具体问题?我们不做教程。
  • 可能是TYPE directive 让您感到困惑。基本上,它指定应返回 xml 数据类型。然后.Value 是作用于该数据类型的方法

标签: sql sql-server tsql xpath sqlxml


【解决方案1】:

这是在不使用用户定义函数的情况下按行连接字符串的唯一方法吗?

这是连接行的最简单方法

在 SQL Server 中如何使用 FOR XML

我想下面的例子会或多或少清楚地理解如何使用它

------------------------------------------------------------
--Create temp table for testing
IF OBJECT_ID('Tempdb..#Z') IS NOT NULL 
    DROP TABLE #Z
CREATE TABLE #Z
    (
      ID INT ,
      SomeText VARCHAR(3)
    )
INSERT  INTO #Z
        ( ID, SomeText )
VALUES  ( 1, 'AAA' ),
        ( 2, 'BBB' ),
        ( 3, 'CCC' ),
        ( 1, 'ZZZ' ),
        ( 1, 'XXX' ),
        ( 2, 'YYY' )
------------------------------------------------------------
--1. Concatenate
SELECT  SUBSTRING(( SELECT  ',' + SomeText
                    FROM    #Z
                  FOR
                    XML PATH('')
                  ), 2, 1000) AS Concatenated
------------------------------------------------------------
--2. Concatenate for each ID
SELECT DISTINCT
        Z_out.id ,
        SUBSTRING(( SELECT  ',' + SomeText
                    FROM    #Z AS Z_in
                    WHERE   Z_in.ID = Z_out.id
                  FOR
                    XML PATH('')
                  ), 2, 1000) AS Concatenated
FROM    #Z AS Z_out

【讨论】:

  • 感谢您的帮助。一些问题,1)为什么使用子字符串? 2) 为什么要在 XML PATH 函数中使用 ' ' 作为参数?
  • 1) 用于删除第一个逗号的子字符串 2) 如果您提供空字符串 (FOR XML PATH ('')),则不会生成包装元素。欲了解更多信息,请使用此链接msdn.microsoft.com/en-us/library/ms190922.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2011-06-15
  • 2023-03-03
  • 2010-11-04
相关资源
最近更新 更多