Sql error: "CREATE/ALTER PROCEDURE" должен быть первым оператором в пакете запросов?
Я пытаюсь создать sql script, но получаю сообщение об ошибке:
'CREATE/ALTER PROCEDURE' должен быть первым оператором в запросе пакетный??
Здесь мой код:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myproc') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[myproc]
create PROCEDURE [dbo].[myproc]
AS
BEGIN
select * from mytable
END
GO
Ответы
Ответ 1
Запустите свой оператор в следующей форме:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myproc') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[myproc]
GO
create PROCEDURE [dbo].[myproc]
AS
BEGIN
select * from mytable
END
GO
Обратите внимание на разделитель партий GO
после DROP PROCEDURE
Ответ 2
Сообщение об ошибке, которое вы получаете, является правильным. Вы можете завершить пакет (и запустить другой) с помощью ключевого слова GO.
Поместите GO прямо перед оператором Create procedure. Вывод GO должен быть на отдельной строке.
Ответ 3
Часто я хочу сделать обратное тому, что вы просите. Например, если пользователь настроил процедуру, и я не хочу терять их изменения, но я хочу применить единообразное обновление script для всех моих клиентов, я хотел бы иметь возможность сделать что-то вроде следующего:
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
create proc myProc
as begin
-- proc stmts here
end
go
Эта логика позволила бы мне создать что-то только в том случае, если оно НЕ существует, но, к моему большому разочарованию, SQL Server также предотвращает это.
Я легко обойду эту проблему следующим образом:
if not exists ( select * from sys.objects
where name='myProc' and objectproperty(object_id,'IsProcedure')=1 )
exec('create proc myProc
as begin
-- proc stmts here
declare @object int = 0
end')
go
Пропустив команду create proc в виде строки и поместив ее в инструкцию exec, мы обходим глупое правило, которое не позволяет делать это в первую очередь.
Ответ 4
Моя проблема исчезла после добавления следующих утверждений:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Ответ 5
Возможно, вы захотите попробовать это, чтобы создать хранимую процедуру в другой базе данных, а не создавать ее в текущем контексте.
set @myScript = 'exec '+ QUOTENAME(@DBName) + '..sp_executesql N''create PROCEDURE [dbo].[myproc]
AS
BEGIN
select * from mytable
END'''
execute(@myScript)