删除并创建 SQL Server 存储过程

6

我想在单个脚本中删除并创建一个过程。我尝试了以下代码:

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)执行。


1
这应该是 DROP PROCEDURE foo 吗? - SqlACID
这是在SSMS中还是您正在尝试在类似Java客户端的其他地方执行? - Conrad Frix
你能否解释一下你想用Maven和这些SQL命令解决的更高级别的问题是什么? - David Atkinson
5个回答

10

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

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


是的,我敢打赌这是在 SSMS 之外执行的。 - NTDLS

5

尝试

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

使用以下语法进行存在性检查会更好:

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;该语法应该有效。


3
我发现在工具之外执行大型脚本的最简单方法是使用SQLCMD。(iSQL 在 sql 2005 之前)这将适用于允许您运行 shell 命令的任何环境。
从 MSDN 文章中可以看到:
sqlcmd 实用程序允许您在命令提示符、SQLCMD 模式下的查询编辑器中、Windows 脚本文件或 SQL Server 代理作业的操作系统(Cmd.exe)作业步骤中输入 Transact-SQL 语句、系统过程和脚本文件。此实用程序使用 OLE DB 来执行 Transact-SQL 批处理。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接