未指定具有 CTE 列名称的 UDF 错误



这个查询我可以独立成功运行,但只要我输入 UDF,

> column name is not specified for column

出现了错误。表就像

Name a b c d e
Peter 1 2 3 2 1
Linda 1 2 2 2 1

例如我简化了查询,例如

ALTER FUNCTION [dbo].[test] 
RETURNS TABLE 
AS
RETURN 
    WITH CTE AS(SELECT 
    a,b,c,d,e
    FROM nametable)
    SELECT
    a,
    b,
    Count(d),
    avg(c)
    FROM CTE Group By a,b

一旦我删除 Count(d(,它就可以工作,但当我添加它时,我无法更改函数。同样的查询,我可以在 SSMS 独立运行。

表函数将用作结果集,因此它需要每个列的列名。如果没有,如何在没有别名的情况下引用特定列?

没有别名的列从它们引用的列推断其名称,但聚合函数和表达式需要显式别名:

DECLARE @Table TABLE (Number INT)
SELECT
    N.*
FROM
    (
        SELECT
            T.Number,           -- Automatic Alias: "Number"
            COUNT(1),           -- No Alias
            T.Number + 10       -- No Alias
        FROM
            @Table AS T
        GROUP BY
            T.Number
    ) AS N

Msg 8155,级别 16,状态 2,第 15 行 未指定列名 "N"的第 2 列。Msg 8155,级别 16,状态 2,第 15 行 无列名 指定用于"N"的第 3 列。

确保在每列上写入显式别名:

DECLARE @Table TABLE (Number INT)
SELECT
    N.*
FROM
    (
        SELECT
            T.Number,
            COUNT(1) AS Count,
            T.Number + 10 AS Plus10
        FROM
            @Table AS T
        GROUP BY
            T.Number
    ) AS N

对于您的示例:

ALTER FUNCTION [dbo].[test] 
(@p1 NVARCHAR(40),
)
RETURNS TABLE 
AS
RETURN 
    WITH CTE AS(SELECT 
        a,b,c,d,e
        FROM nametable)
    SELECT
        a,
        b,
        Count(d) AS d,          -- Here
        avg(c) AS c             -- And here
    FROM 
        CTE 
    Group By 
        a,b

对于CTE,您需要为每列定义一个名称。由于您使用的是表表达式,因此您必须通过为每列命名来明确指定结构。例如,不能有任何列名的表。

您需要为Count(d)指定别名,如下所示。

Count(d) as CountD

除此之外,您的函数中还有其他语法问题。

1- (@p1 NVARCHAR(40),)","是额外的。

2-不是使用单个CTE,而是使用语法不正确的两个CTE

最新更新