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