2011-01-27 10 views
0

Я использую SQL Server 2008.SQL alter recursive function

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

Функция не имеет зависимостей, поэтому я могу безопасно выполнять DROP + CREATE, но что делать, если функция имеет зависимости?

Сообщение об ошибке это один

Msg 8144, Level 16, State 2, TestServer сервера, процедура fn_IsOwnerFunction, линия 177 Процедура или функция dbo.fn_IsOwnerFunction указал слишком много аргументов.

Сообщение появляется еще несколько раз, каждый раз для строки, где функция ссылается на себя. Примечание. Это относится к новой версии, которая имеет больше параметров. После DROP + CREATE скрипт ALTER работает без ошибок.

+0

Что конкретно это сообщение об ошибке? Можно ли здесь вставить функцию? Это может быть просто синтаксическая ошибка. – Dzejms

+0

Я обновил свой вопрос. Функция слишком велика для публикации. – Stijn

+0

Я думаю, что после этого будет более подробно. Msgstr "Неверный синтаксис рядом с ключевым словом XXX" или что-то подобное. – Dzejms

ответ

1

Можно отказаться от функции, которая используется в других функциях или хранимых процедурах. Конечно, после того, как вы сбросили/создали функцию, вам нужно изменить функции и хранимые процедуры, которые используют эту функцию для добавления новых параметров.

+0

Хорошо, я не был уверен, что это безопасно. Если в течение нескольких часов не будет никаких ответов, противоречащих этому, я буду отмечать его как правильный ответ. – Stijn

1

Если ошибка «слишком много аргументов указана», тогда ваш код вызова пропускает слишком много параметров. Это может означать, что оператор ALTER FUNCTION, который вы запускали ранее, фактически не обрабатывался полностью. Это может быть из-за синтаксической ошибки или чего-то подобного. Запустите инструкцию Alter еще раз и проверьте там сообщение об ошибке.

EDIT:

Добавить заявление FUNCTION DROP перед вашим CREATE FUNCTION заявление:

if exists (select * from information_schema.routines Where routine_name = 'udf_FunctionName') 
drop function udf_FunctionName 
GO 

CREATE FUNCTION [dbo].[udf_FunctionName] 

... 
+0

Ошибка в том, что @Stijn добавила новый параметр в функцию. Тело функции проверяется на сигнатуру существующей функции, а не на подпись, которую он меняет. –

+0

Действительно. Я привел простой пример, который вы можете попробовать: http://sql.pastebin.com/D3hEx31M – Stijn

+1

@Stijn: Я думаю, ответ на ваш вопрос на самом деле заключается в том, что его нельзя сделать с помощью alter. Вы должны использовать drop/create –