FOR XML PATH('')
我正在尝试在 TSQL 中使用特定列对列值进行分组。这是两种情况下的结果(请注意,不带 XML 代码 - 即:SELECT * FROM @xml
- 与带 XML 代码相同):
Class | Animals
=================================
Asteroidea | Starfish
Mammalia | Dog
Mammalia | Cat
Mammalia | Coyote
Reptilia | Crocodile
Reptilia | Lizard
根据这篇文章和这篇文章(请注意,第二篇文章省略了GROUP BY
,我不确定作者如何在没有它的情况下成功实现这一点 - 我已经尝试过,它只生成所有值),语法应该是如下图所示:
DECLARE @xml TABLE(
Animal VARCHAR(50),
Class VARCHAR(50)
)
INSERT INTO @xml
VALUES ('Dog','Mammalia')
, ('Cat','Mammalia')
, ('Coyote','Mammalia')
, ('Starfish','Asteroidea')
, ('Crocodile','Reptilia')
, ('Lizard','Reptilia')
SELECT x1.Class
, STUFF((SELECT ',' + x2.Animal AS [text()]
FROM @xml x2
WHERE x1.Animal = x2.Animal
ORDER BY x2.Animal
FOR XML PATH('')),1,1,'' ) AS "Animals"
FROM @xml x1
GROUP BY Class
几个小时后,在这些示例和上面的代码之间,我看不到我在语法上的错误,但我收到错误“列'@xml.Animal'在选择列表中无效,因为它不是包含在聚合函数或 GROUP BY 子句中。” 请注意,如果我不使用 GROUP BY 子句,它仍然不会以适当的方式生成值。另一双眼睛会很有用。