Подтвердить что ты не робот

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
4b9b3361

Ответ 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)