考虑以下脚本:
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之后退出),但我仍然没有解释.
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)