我有一个SQL脚本,每次客户端执行“数据库管理”功能时都必须运行。该脚本包括在客户端数据库上创建存储过程。其中一些客户端在运行脚本时可能已经拥有存储过程,而另一些客户端可能没有。我需要将丢失的存储过程添加到客户端数据库中,但无论我如何尝试改变T-SQL语法,我都得到了这个结果

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

我在创作作品之前读到过这种说法,但我不喜欢这样做。

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

CREATE PROCEDURE MyProc
...

如何添加检查存储过程是否存在,如果存储过程不存在则创建它,如果存储过程存在则修改它?


当前回答

创建程序(如果不存在)结束

其他回答

我知道这是一个非常老的帖子,但由于这出现在顶部搜索结果中,因此为那些使用SQL Server 2016 SP1 -的人添加了最新更新

create or alter procedure procTest
as
begin
 print (1)
end;
go

如果存储过程不存在,则创建存储过程;如果存储过程存在,则更改存储过程。

参考

我也犯了同样的错误。我知道这个线程已经死了,但我想设置另一个选项除了“匿名过程”。

我是这样解决的:

Check if the stored procedure exist: IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='my_procedure') BEGIN print 'exists' -- or watever you want END ELSE BEGIN print 'doesn''texists' -- or watever you want END However the "CREATE/ALTER PROCEDURE' must be the first statement in a query batch" is still there. I solved it like this: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE -- view procedure function or anything you want ... I end up with this code: IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('my_procedure')) BEGIN DROP PROCEDURE my_procedure END SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].my_procedure ...

如果你正在寻找最简单的方法来检查数据库对象是否存在,然后再删除它,这里有一种方法(示例使用SPROC,就像上面的例子一样,但可以修改表,索引等…):

IF (OBJECT_ID('MyProcedure') IS NOT NULL)
  DROP PROCEDURE MyProcedure
GO

这是快速和优雅的,但您需要确保在所有对象类型中都有唯一的对象名称,因为它不会考虑这一点。

在Sql server 2008以后,你可以使用"INFORMATION_SCHEMA. xml "。例程”

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_NAME = 'MySP'
        AND ROUTINE_TYPE = 'PROCEDURE') 

除了来自@Geoff的回答之外,我还创建了一个简单的工具,它可以生成一个sql文件,其中包含存储过程、视图、函数和触发器的语句。

查看我的团。