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

时间:2019-02-07 07:57:32

标签: sql-server

此查询我可以成功独立运行,但是只要输入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上独立运行。

2 个答案:

答案 0 :(得分:1)

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

您需要像下面这样为Count(d)命名。

Count(d) as CountD

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

1- (@p1 NVARCHAR(40),)“,”是多余的。

2-您使用的是两个语法错误的CTE,而不是使用单个CTE

答案 1 :(得分:1)

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

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

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
  

消息8155,级别16,状态2,第15行没有为列指定名称   “ N”的第2列。消息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