【发布时间】:2015-12-01 18:39:54
【问题描述】:
我有两个用户函数,一个调用另一个。
首先定义为
CREATE FUNCTION [dbo].[fnTest] (
@a INT
, @b INT
)
RETURNS @data TABLE (
A varchar(20),
B varchar(20),
C varchar(20)
)
AS BEGIN
INSERT INTO @data
SELECT 'A' A, 'B' B, 'C' C
RETURN
END
另一个是从第一个中选择的:
CREATE FUNCTION [dbo].[fnTest2] (
@a INT
, @b INT
, @c VARCHAR(20)
) RETURNS TABLE
AS
RETURN SELECT * FROM dbo.fnTest(@a, @b) WHERE C = @c
当我ALTER第一个函数时,在结果中添加一个新列(例如D),第二个函数仍然保持不变并且只返回原始列(即它完全忽略D列)直到它是ALTER编辑也是如此。
我非常清楚如何解决这个问题(指定 Test2 中的所有列或通过 ALTER 命令重新创建 Test2),但我的问题是 - 为什么我需要这样做?是否有一些设置会自动重建它?
作为记录,我使用的 ALTER 查询是:
ALTER FUNCTION [dbo].[fnTest] (
@a INT
, @b INT
)
RETURNS @data TABLE (
A varchar(20),
B varchar(20),
C varchar(20),
D varchar(20)
)
AS BEGIN
INSERT INTO @data
SELECT 'A' A, 'B' B, 'C' C, 'D' D
RETURN
END
【问题讨论】:
-
顺便说一句,当视图被创建为
select * ...时会看到相同的行为。向基础表添加列不会向视图添加列。 -
感觉就像创建或修改一个调用另一个函数的函数会创建第一个函数使用的字段列表。在更新调用函数之前,此字段列表似乎不会更改。我也想知道为什么。
标签: sql sql-server tsql sql-server-2012 user-defined-functions