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