2009-02-12 2 views
3

Предположим, что вы пишете функцию в SQL Server, которая условно вызывает себя. Если вы пишете функцию с нуля, закончите ее и попытайтесь ее создать, SQL Server жалуется.SQL-функции и рекурсия

Жалоба заключается в том, что функция, которую вы вызываете из своей функции, не существует. Конечно, это не так, это рекурсивно!

Чтобы заставить его работать, вы должны прокомментировать рекурсивный вызов, создать функцию, раскомментировать вызов и изменить функцию. Вы должны пройти через эту глупость, если вы когда-либо измените параметры, которые принимает функция (в этом случае она жалуется, что в вашем новом рекурсивном вызове слишком много или слишком мало параметров).

Есть ли способ обойти это?

+0

Несмотря на формулировку, я думаю, что это всего лишь один вопрос с двумя примерами проблем, вызванных той же проблемой. – JohnFx

+0

Они связаны в том смысле, что оба они одновременно раздражают меня. Я думаю, что я разлучу их. – colithium

ответ

5

Для хранимых процедур вы должны получить сообщение об ошибке, как это, что вы можете просто игнорировать:

Невозможно добавить строки в sysdepends для текущего объекта, поскольку это зависит от отсутствует объект «sub_proc1». Объект все равно будет создан.

Для пользовательских функций это немного сложнее, но он работает (по крайней мере, для меня на SQL 2k8), если вы полностью квалифицируете имя функции в рекурсивном вызове.

CREATE FUNCTION recursiveUDF() RETURNS int 
AS 
BEGIN 

    DECLARE @X int 

    --Fails with "recursiveUDF is not a recognized built-in function name." 
    SET @X = recursiveUDF()   

    --works! 
    SET @X = dbo.recursiveUDF() 

    RETURN 1 
END 
+0

Создание должно работать - это просто предупреждение, которое вы можете игнорировать. –

+0

Это делает трюк при создании функции, однако Alter все еще не работает. Я думаю, что это досада, с которой мне просто придется жить. – colithium

+0

Почему бы просто не сделать «if exists..drop», а затем «Создать» вместо alter? Это немного больше усилий, но это не так страшно. – JohnFx