删除并创建SQL Server过程

时间:2011-06-22 16:20:57

标签: sql-server stored-procedures

我正在尝试删除并在单个脚本中创建一个过程。我试过这个:

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Foo')
  DROP PROCEDURE Foo
  GO

CREATE PROCEDURE dbo.Foo
-- procedure body here

但是我收到了一个错误:

  

'GO'附近的语法不正确。

如果我删除GO,则会收到错误消息:

  

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

更新

这些脚本由Java构建工具(Maven)执行

5 个答案:

答案 0 :(得分:9)

GO实际上并不是T-SQL中的有效术语,它只是Microsoft管理工具用于分隔查询批处理的分隔符。

你用什么来运行脚本?如果您尝试在代码中执行此操作,则需要将其拆分为两个语句,可能使用正则表达式进行拆分^GO$

答案 1 :(得分:3)

我发现从工具中执行SSMS之外的大型脚本的最简单方法是使用SQLCMD。 (iSQL pre sql 2005)这适用于任何允许您运行shell命令的环境。

来自MSDN文章

  

sqlcmd实用程序可让您输入   Transact-SQL语句,系统   程序和脚本文件   命令提示符,在查询编辑器中   SQLCMD模式,在Windows脚本文件中   或在操作系统(Cmd.exe)中   SQL Server代理作业的作业步骤。   此实用程序使用OLE DB执行   Transact-SQL批处理。

答案 2 :(得分:2)

尝试

IF OBJECT_ID ('idhere') IS NOT NULL
   DROP PROCEDURE idhere
GO
CREATE PROCEDURE idhere
@paramsHere PARAMTYPE
AS
BEGIN
     //...code here...
END
GO

我就是这样做的,我不确定我的作品使用的是什么版本的SQL SERVER,我相信它的2005年。

答案 3 :(得分:2)

最好将此语法用于存在检查:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[foo]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[foo]
GO

如上所述,如果在任何模式中都存在foo sproc,它会尝试删除它。不确定这是否会让你的问题消失。如果使用SSMS,则可以选择将存储过程编写为DROP和CREATE;该语法应该有效。

答案 4 :(得分:0)

查看Jon Galloway的帖子:Handling "GO" Separators in SQL Scripts - the easy way

它可能有你想要的答案。