SQL错误:'CREATE / ALTER PROCEDURE'必须是查询批处理中的第一个语句?

时间:2012-01-29 04:41:42

标签: sql-server-2008 tsql

我正在尝试创建一个sql脚本,但收到错误:

  

'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

5 个答案:

答案 0 :(得分:46)

以下列形式运行您的陈述:

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批处理分隔符

答案 1 :(得分:25)

您收到的错误消息是正确的。您可以使用GO关键字终止批处理(并启动另一个批处理)。

将GO放在Create过程语句之前。 GO语句必须单独排在一行。

答案 2 :(得分:10)

我经常希望与你提出的要求相反。例如,如果用户已经自定义了一个过程,并且我不想丢失他们的更改,但我想为所有客户端应用统一的更新脚本,我希望能够执行以下操作:< / p>

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语句中,我们绕过了一个阻止人们首先执行此操作的愚蠢规则。

答案 3 :(得分:4)

在我添加以下声明后,我的问题消失了:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

答案 4 :(得分:2)

您可能希望尝试在另一个数据库中创建存储过程,而不是在当前上下文中创建它。

set @myScript = 'exec '+ QUOTENAME(@DBName) + '..sp_executesql N''create PROCEDURE [dbo].[myproc]
AS
BEGIN
    select * from mytable
END'''
execute(@myScript)