为什么在RETURN之后继续执行查询?

时间:2016-12-08 18:25:19

标签: sql-server tsql

考虑以下脚本:

IF OBJECT_ID('tempdb.dbo.#INTERMED', 'U') IS NOT NULL
    DROP TABLE #INTERMED; 

IF OBJECT_ID('tempdb.dbo.#INTERMED1', 'U') IS NOT NULL
    DROP TABLE #INTERMED1; 

PRINT 'Inserting INTO #INTERMED'
GO

SELECT 11 AS Col1
INTO #INTERMED

RETURN -- Why does execution continue below this line?

PRINT 'Inserting INTO #INTERMED1' -- This doesn't print anything
GO
SELECT 'Testing testing 123' AS Col2 
INTO #INTERMED1

SELECT * FROM #INTERMED1 i

当你在SSMS中运行时,你会注意到RETURN被忽略,RETURN之后的PRINT语句没有做任何事情然后继续执行。

有人可以解释原因吗?我希望它能在RETURN之后立即退出。

我确实发现它与GO语句有某种关系,因为如果我注释掉所有GO语句,它会按预期运行(在RETURN之后退出)但我仍然没有解释。

1 个答案:

答案 0 :(得分:5)

GO 不属于SQL语言。它是 Management Studio 使用的批处理分隔符,并且也被其他一些工具用作约定,但它在语言本身中没有特殊含义。尝试在存储过程中使用它,看看我的意思。

因此,如果您有一个批次,那么会发生以下情况:

IF OBJECT_ID('tempdb.dbo.#INTERMED', 'U') IS NOT NULL
    DROP TABLE #INTERMED; 

IF OBJECT_ID('tempdb.dbo.#INTERMED1', 'U') IS NOT NULL
    DROP TABLE #INTERMED1; 

PRINT 'Inserting INTO #INTERMED'

它做了它的事情,然后你有一个看起来像这样的新批次:

SELECT 11 AS Col1
INTO #INTERMED

RETURN -- Why does execution continue below this line?

PRINT 'Inserting INTO #INTERMED1' -- This doesn't print anything

它运行到RETURN语句,此时批次,只有该批次,返回/结束。但是,还有一个批次要运行:

SELECT 'Testing testing 123' AS Col2 
INTO #INTERMED1

SELECT * FROM #INTERMED1 i

同样,这是一个全新的批次。之前的RETURN语句没有任何意义。就像你按顺序调用了三种方法一样。

我在评论中也看到了这一点:

  

我进入它的原因是在脚本仍在执行时实际上有PRINT语句输出。

有更好的方法。查看RAISERROR声明:

RAISERROR('My Progress Message',0,1) WITH NOWAIT