Sql server 具有XML路径的函数不起作用
我想写一个函数,从不同的行和组按id对字段进行压缩。Sql server 具有XML路径的函数不起作用,sql-server,Sql Server,我想写一个函数,从不同的行和组按id对字段进行压缩。 当我在TSql中执行代码时,工作正常,但当我将其作为函数执行时,它会返回错误的数据,为什么 CREATE TABLE YourTable ([ID] INT, [Name] CHAR(1), [Value] INT) INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (1,'A',4) INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (
当我在TSql中执行代码时,工作正常,但当我将其作为函数执行时,它会返回错误的数据,为什么
CREATE TABLE YourTable ([ID] INT, [Name] CHAR(1), [Value] INT)
INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (1,'A',4)
INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (1,'B',8)
INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)
INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (3,'d',9)
INSERT INTO YourTable ([ID],[Name],[Value]) VALUES (3,'u',9)
SELECT
[ID],
STUFF((
SELECT ', ' + [Name]
FROM YourTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS NameValues
FROM YourTable Results
GROUP BY id;
第一次查询输出:
ID NameValues
1 A, B
2 C
3 d, u
ID NameValues
1 A
1 B
2 C
3 d
3 u
SELECT
[ID],
STUFF((
SELECT ', ' + [Name]
FROM YourTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS NameValues
FROM YourTable Results
GROUP BY id;
第二次查询输出:
ID NameValues
1 A, B
2 C
3 d, u
ID NameValues
1 A
1 B
2 C
3 d
3 u
SELECT
[ID],
STUFF((
SELECT ', ' + [Name]
FROM YourTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS NameValues
FROM YourTable Results
GROUP BY id;
您的函数无法工作,因为交叉应用将对外部查询的每一行执行一次并输出结果 在第一个查询中,您一次计算所有数据,执行的逻辑顺序如下所示 查询:
ID NameValues
1 A, B
2 C
3 d, u
ID NameValues
1 A
1 B
2 C
3 d
3 u
SELECT
[ID],
STUFF((
SELECT ', ' + [Name]
FROM YourTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS NameValues
FROM YourTable Results
GROUP BY id;
1.根据您表格中的id分组2.使用XML对存在的所有ID进行分类
在第二个查询中,您使用交叉应用一次传递一行,它将只有一行要concat,因此您的输出会有所不同这个函数如何:
CREATE FUNCTION dbo.CONCAT_String_group_by_id (@id int)
RETURNS TABLE AS return
WITH cte AS(
SELECT *
FROM YourTable
WHERE id = @id
)
SELECT
[ID],
STUFF((
SELECT ', ' + [Name]
FROM cte
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS NameValues
FROM cte Results
GROUP BY id
在函数中,CTE中只有一行(
WITH
),因此在NameValues
中总是会有一个字母加上1作为示例数据。您是否也可以添加预期和实际结果这对于特定的表,我想构建通用函数