在动态SQL中使用RETURN退出存储过程

时间:2016-03-07 20:38:07

标签: sql sql-server sql-server-2012

我试图在我的存储过程中使用类似下面的东西在满足某个条件时退出,但返回后的代码被执行。我的剧本有什么不对吗?

declare @DBName sysname
set @DBName ='Test_DB'
SET @sql='IF OBJECT_ID('''+@DBName +''',''U'') is null' + CHAR(10)+  'RETURN;' 
EXEC (@sql)

2 个答案:

答案 0 :(得分:1)

您可以使用INSERT/EXEC获取您要检查的动态对象的对象ID,如果该表没有记录不返回,则返回:

DECLARE @DBName sysname
SET @DBName = 'Test_DB'
SET @sql='SELECT OBJECT_ID('''+@DBName +''',''U'')'
DECLARE @Results TABLE (ObjectId INT)
INSERT @Results
    EXEC (@Sql)
IF NOT EXISTS (SELECT * FROM @Results WHERE ObjectId IS NOT NULL)
    RETURN

只是旁注,OBJECT_ID不匹配数据库。您必须使用sys.databases或类似。

答案 1 :(得分:0)

我测试了一个类似的脚本:

declare @DBName sysname
set @DBName ='Test_DB'
declare @sql varchar(8000)
SET @sql='IF OBJECT_ID('''+@DBName +''',''U'') is null' +
    CHAR(10) +
    'begin select ''before return'' return end select ''after return'''
EXEC (@sql)

SQL 2014 Developer Edition上此脚本的输出是“返回前”,而不是“返回后”。所以回报似乎按预期工作。