Sql server 具有XML路径的函数不起作用

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 (

我想写一个函数,从不同的行和组按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 (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作为示例数据。您是否也可以添加预期和实际结果这对于特定的表,我想构建通用函数