SQL创建过程中止逻辑
大家下午好- 我有一个临时存储过程,需要在几个地方作为修补程序运行,如果应用程序的版本与我输入的版本不完全一致,我希望中止SP的创建和编译。我有工作的基本想法,但我希望消息出来时不会因为试图编译SP而出现所有模式问题 以下是我的基本情况: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
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模式。谢谢大家的帮助!