2013-04-28 5 views
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 не выходит.

Любая идея?

+5

Это стандартное, документированное поведение SQL Server. Это ** ** - не ошибка. –

+0

@marc_s: Любая ссылка? – Alireza

+5

См. [Разрешение отложенного имени] (http://msdn.microsoft.com/en-us/library/ms190686.aspx) - это относится как к функциям, так и к процедурам –

ответ

4

Почему вы думаете, что это ошибка? Так как код на самом деле не выполнен, пока вы не запустите функцию Foo, есть случай, который должен быть сделан , что - это точка, в которой должна быть сделана проверка.

Возможно, вы пишете свои функции сверху вниз, а не снизу вверх, и сначала хотите написать верхние уровни, свернув вниз до деталей.

Если это не документировано работать в одну сторону, и она работает по-другому, это не ошибка, просто разногласие между вами и Microsoft :-)

+0

Прежде всего, я не думаю, что мы можем продолжать использовать только одну стратегию проектирования в жизненном цикле приложения, иногда мы поднимаемся вверх, иногда снизу вверх. Кроме того, рефакторинг базы данных имеет значение. Во всяком случае, я думаю, комментарий marc_a и ссылка очень полезны – Alireza

+2

@Alireza, я не заявляю, что вы должны использовать только одну стратегию. Фактически, функция, которая должна существовать, ограничит вас снизу вверх. Если вы хотите использовать сверху вниз, вы должны иметь возможность создавать вещи, которые ссылаются на несуществующие предметы (которые вы еще не определили). В любом случае, это все еще только _bug_, если вы можете найти doco, который говорит, что это запрещено. – paxdiablo

+0

Верно, теперь я тебя понимаю. благодаря – Alireza

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 для проверки таких вещей, как ссылки на несуществующие объекты/столбцы без использования схемы.

Смежные вопросы