停止在批处理文件中运行过程

时间:2013-06-21 15:18:15

标签: sql-server stored-procedures batch-file return

我正在创建一个部署包,它将运行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文件。

1 个答案:

答案 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