SQL创建过程中止逻辑

SQL创建过程中止逻辑,sql,sql-server,tsql,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

大家下午好-

我有一个临时存储过程,需要在几个地方作为修补程序运行,如果应用程序的版本与我输入的版本不完全一致,我希望中止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不在DB中结束,我确实收到了一个错误,但由于过去的架构更改,我也会出现架构错误。由于SP需要成为批处理中的第一条语句,我不能使用IF/ELSE和NOEXEC生成与RAISERROR相同的结果(没有错误)


如果SP遇到RAISERROR,那么在不检查模式的情况下如何才能得到与上述相同的结果,这样我就不会报告一堆额外的消息?

执行错误检查时,
RETURN
语句将退出SP,在
IF
语句之后和
RAISERROR
语句之后放置
BEGIN
END
,在
RETURN
语句之后放置
RETURN
语句。

您想要的是停止脚本执行的错误条件,这可以通过简单的
: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已经足够了,这将解决您投诉的错误日志问题。

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

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

谢谢,这实际上最符合我想要做的。SQLCMD可以很好地工作,除了我想保护那些显然没有对SP的文档和命名给予足够关注的人,以及那些错过版本注释的人,他们可能不会看到另一个注释来切换到SQLCMD模式。谢谢大家的帮助!