0

在这里,我将展示从另一个函数引用一个不存在的函数是可能的,并且 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函数没有退出,但这个脚本创建了函数。

任何想法?

4

2 回答 2

5

为什么你认为这是一个错误?由于代码在您运行该函数之前并未实际执行Foo,因此有一种情况是应该进行检查

也许您以自上而下的方式编写函数,而不是自下而上的方式,并且您想先编写上层,然后再深入到细节。

除非它被记录为以一种方式工作并且它以另一种方式工作,否则它不是一个错误,只是你和微软之间的分歧:-)

于 2013-04-28T07:38:44.577 回答
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项目来验证引用不存在的对象/列等内容,而无需使用架构绑定。

于 2013-04-28T09:54:15.937 回答