【发布时间】:2017-04-17 13:52:31
【问题描述】:
我在 SQL Server 中模拟 PostgreSQL 风格的 generate_series() 表值函数:
CREATE FUNCTION generate_series(@d1 DATE, @d2 DATE)
RETURNS TABLE AS
RETURN
-- Ignore implementation (returning a single DATE column) for this question
现在可以按预期使用:
SELECT *
FROM generate_series(
CAST ('2005-07-01' AS DATE),
CAST ('2005-07-31' AS DATE)
) t
现在我想使用派生列列表语法来重命名列以及表:
SELECT *
FROM generate_series(
CAST ('2005-07-01' AS DATE),
CAST ('2005-07-31' AS DATE)
) t(col)
产生此错误的原因:
消息 195,第 15 级,状态 15,第 5 行
“generate_series”不是可识别的函数名称。
... 而这种语法(限定函数)...
SELECT *
FROM dbo.generate_series(
CAST ('2005-07-01' AS DATE),
CAST ('2005-07-31' AS DATE)
) t(col)
...正在产生此错误:
消息 317,第 16 级,状态 1,第 5 行
表值函数“generate_series”不能有列别名。
在我看来,这种语法是完全有效的。它在 PostgreSQL、标准 SQL 和“普通”T-SQL 中也是如此,例如:
SELECT *
FROM (
VALUES (1),(2)
) t(col)
我做错了什么?我怎么能做到这一点? (I'm aware of the possibility of emulating this,但我想真正使用派生列列表语法)。
我使用的是 SQL Server Express 2014
【问题讨论】:
-
你需要架构/函数所有者。默认为
dbo因此将给出FROM dbo.generate_series -
@MatBailie:呃。好的谢谢。但这还不能解决问题。会更新。
-
鉴于错误消息 317 的性质,我们应该说,这似乎很奇怪,具体,我不希望找到一种方法来直接将列别名应用于一个表值函数。
-
语法在这里msdn.microsoft.com/en-us/library/ms177634.aspx。
column_alias只能在少数情况下使用。不包括user_defined_function -
@MartinSmith:谢谢,如果你想这么说,那将是理想的答案。有趣的是,
@variable.function_call... 允许使用列别名
标签: sql sql-server tsql alias user-defined-functions