我有三个表函数:
第1步:
CREATE FUNCTION [dbo].[func1] ()
RETURNS TABLE AS
RETURN
(
SELECT
1 AS col1,
2 AS col2,
3 AS col3
)
GO
CREATE FUNCTION [dbo].[func2] ()
RETURNS TABLE AS
RETURN
(
SELECT * FROM func1()
)
GO
CREATE FUNCTION [dbo].[func3] ()
RETURNS TABLE AS
RETURN
(
SELECT
col1,
col2,
col3
FROM func2()
)
GO
当我在名为 col4 的 func1 中添加新列时,问题就出现了,我尝试在 func3 中添加相同的列名称。
第2步:
ALTER FUNCTION [dbo].[func1] ()
RETURNS TABLE AS
RETURN
(
SELECT
1 AS col1,
2 AS col2,
3 AS col3,
4 AS col4, --the new column
)
GO
func2 保持不变,因为'从func1中选择所有列'。
更改 func3 以从func1添加相同的列( col4 ):
ALTER FUNCTION [dbo].[func3] ()
RETURNS TABLE AS
RETURN
(
SELECT
col1,
col2,
col3,
col4, -- the new column from func1
FROM func2()
)
GO
当我运行最后一个查询时,我收到以下错误消息:
消息207,级别16,状态1,过程func3,行11无效列 名字'col4'。
我的问题是:MSSQL在缓存中有一些引用吗? 我尝试重新启动SQL Server,但此解决方案不起作用。
我发现的唯一方法是在没有改变的情况下改变func2并运行func3的改变。
是其他方法,或者是什么原因?
答案 0 :(得分:0)
您需要刷新函数,以便sql重新编译它们
EXEC sys.sp_refreshsqlmodule 'func2';
否则sql server只会“看到”旧版本并且没有检测到func2中有变化
MSDN说:
当对模块中影响其定义的对象进行更改时,应运行sp_refreshsqlmodule。否则,在查询或调用模块时,模块可能会产生意外结果。 MSDN