gpt4 book ai didi

sql-server - 为什么在 RETURN 后查询继续执行?

转载 作者:行者123 更新时间:2023-12-03 16:50:24 26 4
gpt4 key购买 nike

考虑以下脚本:

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 语句不执行任何操作,然后继续执行。

有人可以解释为什么吗?我希望它在返回后立即退出。

我确实发现它与 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'

它完成它的事情,然后你有一个看起来像这样的新批次:
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声明没有任何意义。就像你依次调用了三个方法。

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

The reason I had GO in it is to actually have PRINT statements output something while script is still executing.



有更好的方法。查看 RAISERROR陈述:
RAISERROR('My Progress Message',0,1) WITH NOWAIT

关于sql-server - 为什么在 RETURN 后查询继续执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41046342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com