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