我有一个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

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

参考

其他回答

您可以在任何能够运行查询的地方运行过程代码。

复制AS后面的所有内容:

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

这段代码所做的事情与存储的proc完全相同,但是没有存储在数据库端。

这很像PL/SQL中所谓的匿名过程。

更新:

你的题目有点让人困惑。

如果您只需要在过程不存在的情况下创建它,那么您的代码就可以了。

下面是SSMS在创建脚本中输出的内容:

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) ) 
DROP …
CREATE …

更新:

当包含模式时如何做的例子:

IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[MyProc]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

在上面的例子中,dbo是模式。

更新:

在SQL Server 2016+中,您可以这样做

创建或修改过程dbo。MyProc

在T-Sql中删除并重新创建存储的proc的最简单方法是**

Use DatabaseName
go
If Object_Id('schema.storedprocname') is not null
begin
   drop procedure schema.storedprocname
end
go

create procedure schema.storedprocname
as

begin
end

如果存在则删除 是SQL Server 2016的新特性吗

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]

我想知道!为什么我不写整个查询像这样

GO
create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
as
begin
insert into tblClass values (@ClassName,@ClassFee)
end

GO
create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
as
begin
insert into tblSection values(@SectionName,@ClassID)
end

Go
create procedure test
as
begin 
select * from tblstudent
end

我已经知道前两个过程已经存在,SQL将运行查询将给出前两个过程的错误,但它仍然会创建最后一个过程 SQl本身是照顾什么是已经存在的,这是我总是做我的客户端!

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

查看我的团。