我正在尝试删除并在单个脚本中创建一个过程。我试过这个:
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)执行
答案 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
它可能有你想要的答案。