SQL创建过程中止逻辑

时间:2012-03-26 20:43:14

标签: sql sql-server tsql

下午好 -

我有一个临时存储过程,需要在几个地方作为修补程序运行,如果应用程序的版本不是我输入的,我想中止SP的创建和编译。我有基本的想法,但我希望这些消息在没有尝试编译SP的所有模式问题时出现。

这基本上就是我所拥有的:

IF EXISTS ... DROP PROCEDURE 

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10)
RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG

CREATE PROCEDURE ....

RAISERROR导致SP不会在数据库中结束,但我确实收到了错误,但由于过去的架构更改,我最终也遇到了架构错误。由于SP需要成为批处理中的第一个语句,我不能使用IF / ELSE和NOEXEC产生与RAISERROR相同的结果(没有错误)。

如果没有SP检查架构,如果它到达RAISERROR,那么可以采取哪些措施来获得与上述相同的结果?所以我最终没有报告一堆额外的消息?

3 个答案:

答案 0 :(得分:1)

你想要的是停止执行脚本的错误条件,这可以在SQLCMD mode of the query editor中使用简单的:on error exit

:on error exit

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10)
   RAISERROR ('This is for U10 only. Check the application version.', 16, 1);
go

IF EXISTS ... DROP PROCEDURE 
go

CREATE PROCEDURE ....
...
go

有了这个,就没有必要提高严重程度20.严重程度16就足够了,这会照顾你抱怨的ERRORLOG问题。

答案 1 :(得分:0)

RETURN语句将退出SP。在进行错误检查时,请在BEGIN声明之后和END发出IF声明之后设置RAISERRORRETURN

答案 2 :(得分:0)

这里有几个选项。我的方法如下,因为我觉得它提供了最好的流程:

IF EXISTS ... DROP PROCEDURE 

IF EXISTS (SELECT * FROM Application_Version WHERE Version = 10)
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = 'CREATE PROCEDURE blablabla AS
        BEGIN
            -- Your Procedure HERE
        END'
    EXEC sp_executesql @sql
END ELSE
    RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG