我正在创建一个部署包,它将运行VSS中的存储过程。我能做到这一点,但问题是这个。我有或多或少需要部署30个数据库,我只有两个数据库,不需要获取更新。有了这个,我将以下代码包含在运行批处理文件的.sql文件中:
IF OBJECT_ID('CONFIG') IS NULL OR DB_NAME() LIKE '%SampleDB%'
BEGIN
PRINT 'This is not a store database. Skipping this database.'
SET NOEXEC ON
RETURN
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = OBJECT_ID(N'[dbo].[sp_ThisIsMySampleProcedure]'))
DROP PROCEDURE [dbo].[sp_ThisIsMySampleProcedure]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[sp_ThisIsMySampleProcedure]
-- Everything else follows...
这个SQL代码在SQL Server上运行完美。每当我针对Sample DB运行它时,它会自动跳过检查程序是否存在以及之后的所有内容。
但每当我尝试使用我的批处理文件对SampleDB运行它时,它会提示错误消息但继续运行该程序而忽略我的RETURN
关键字。所以消息看起来像这样:
这不是商店数据库。跳过此数据库。
Msg 3701,Level 11,State 5,Line 8
无法删除程序'sp_ThisIsMySampleProcedure',因为它不存在或您没有权限。
我理解错误消息是正确的,因为我的SampleDB上确实不存在该过程。但是为什么在满足跳过运行整个脚本的条件之后我有RETURN
关键字时它仍然继续运行?
谢谢!
修改
好吧,我认为人们并不完全了解我。这是场景:我的过程(见上文)在SQL Server Management Studio上运行良好。我的意思是,每当我尝试在SampleDB上运行它时,它都会给我发送消息This is not a store database. Skipping this database.
但每当我尝试运行执行此存储过程的Batch-File时,我会在命令提示符下收到此消息:
这不是商店数据库。跳过此数据库。
Msg 3701,Level 11,State 5,Line 8
无法删除程序'sp_ThisIsMySampleProcedure',因为它不存在或您没有权限。
这基本上意味着批处理文件继续执行整个SQL脚本,无论第一个条件是否满足。
我的问题是如何让批处理文件知道每当SQL Server抛出消息This is not a store database. Skipping this database.
时,批处理文件将立即停止执行sql文件。
答案 0 :(得分:1)
首先。关键字GO
将文件划分为单独的请求。每个请求由服务器单独处理。 RETURN
仅从第一个请求退出,其他请求将被运行。
试试这个:
select 1
RETURN
select 2
go
select 3
go
其次,SET NOEXEC ON
是危险的,它会阻止所有后续执行。试试这个:
select 1
SET NOEXEC ON
RETURN
select 2
go
select 3
go
SET NOEXEC OFF
go
您可以在所有服务器上创建过程,但是如果数据库名称那样,则在beginig中从它返回。或者您可以删除GO
并使用动态SQL创建存储过程:
IF DB_NAME() like '%mydb%'
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[my proc]
AS
BEGIN
select 1
END'
END