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

Joe*_*moe 3 t-sql sql-server

考虑以下脚本:

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
Run Code Online (Sandbox Code Playgroud)

当您在SSMS中运行它时,您会注意到忽略RETURN,RETURN之后的PRINT语句不执行任何操作,然后继续执行.

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

我确实发现它与GO语句有某种关联,因为如果我注释掉所有GO语句,它的行为与预期一样(在RETURN之后退出),但我仍然没有解释.

Joe*_*orn 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'
Run Code Online (Sandbox Code Playgroud)

它确实是这样,然后你有一个新的批处理,如下所示:

SELECT 11 AS Col1
INTO #INTERMED

RETURN -- Why does execution continue below this line?

PRINT 'Inserting INTO #INTERMED1' -- This doesn't print anything
Run Code Online (Sandbox Code Playgroud)

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

SELECT 'Testing testing 123' AS Col2 
INTO #INTERMED1

SELECT * FROM #INTERMED1 i
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

RAISERROR('My Progress Message',0,1) WITH NOWAIT
Run Code Online (Sandbox Code Playgroud)