在这里,我将展示从另一个函数引用一个不存在的函数是可能的,并且SQL Server在执行时间之前不会检查它:
USE [SomeDataBase];
SELECT dbo.Booo();
显然,如果您没有函数Booo
,则会生成关于无法识别函数Booo
的错误。这不是一个惊喜!
现在,试试这个:
CREATE FUNCTION dbo.Foo()
RETURNS INT
AS
BEGIN
DECLARE @Temp INT
SET @Temp = (SELECT dbo.Booo())
RETURN 1
END
令人惊讶的是,尽管Foo
函数没有退出,但这个脚本创建了函数Booo
。
有什么想法吗?
答案 0 :(得分:4)
为什么你认为这是一个错误?由于在运行Foo
函数之前代码实际上并未执行 ,因此有一种情况可以确定 是应该进行检查的点
也许你是以自上而下的方式编写函数,而不是自下而上的方式,并且你想先编写高级函数,稍后深入研究具体细节。
除非记录以单向工作并且它以另一种方式工作,否则它不是错误,只是您和Microsoft之间的分歧: - )
答案 1 :(得分:2)
如果你这样做
CREATE FUNCTION dbo.Foo()
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
DECLARE @Temp INT
SET @Temp = (SELECT dbo.Booo())
RETURN 1
END
您收到所需的错误,但未创建该功能。这确实会使未来更改dbo.Booo
的定义更加痛苦(需要首先删除dbo.Foo
)。
您还可以使用SQL Server Data Tools项目来验证引用不存在的对象/列,而不使用架构绑定。