为什么我可以在另一个函数中引用不存在的函数?

时间:2013-04-28 07:36:20

标签: sql-server-2008 tsql

在这里,我将展示从另一个函数引用一个不存在的函数是可能的,并且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

有什么想法吗?

2 个答案:

答案 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项目来验证引用不存在的对象/列,而不使用架构绑定。