我有一个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
...
如何添加检查存储过程是否存在,如果存储过程不存在则创建它,如果存储过程存在则修改它?
您可以在任何能够运行查询的地方运行过程代码。
复制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