大家下午好-
我已经有了基本的想法,但我希望消息出来时没有试图编译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,那么可以做些什么来获得与上面相同的结果,而不需要检查架构,这样我就不会收到一堆额外的消息报告?
发布于 2012-03-27 06:15:39
您需要的是停止执行脚本的错误条件,这在使用简单:on error exit的SQLCMD mode of the query editor中是可能的
: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问题。
发布于 2012-03-27 06:10:39
RETURN语句将退出SP。在进行错误检查时,在IF语句后面加上BEGIN和END,在RAISERROR后面加上RETURN语句。
发布于 2012-03-27 20:02:14
这里有几个选项。我的方法如下,因为我觉得它提供了最好的流程:
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 LOGhttps://stackoverflow.com/questions/9879525
复制相似问题