Sql server TSQL RETURN语句不会停止批处理的执行

Sql server TSQL RETURN语句不会停止批处理的执行,sql-server,tsql,return,Sql Server,Tsql,Return,从联机丛书中,RETURN语句定义为: 无条件退出查询或过程。RETURN是即时的、完整的,可以在任何时候从过程、批处理或语句块中退出。不执行RETURN后面的语句 请注意,它可以停止批处理。但是,我的测试与此不符。下面是我的测试代码 IF DATABASEPROPERTYEX(N'data', N'Version') IS NULL RETURN; USE data; 我选择此代码并在SQLServerManagementStudio中运行它。结果是: 信息911,16级,状态1,

从联机丛书中,RETURN语句定义为:

无条件退出查询或过程。RETURN是即时的、完整的,可以在任何时候从过程、批处理或语句块中退出。不执行RETURN后面的语句

请注意,它可以停止批处理。但是,我的测试与此不符。下面是我的测试代码

IF DATABASEPROPERTYEX(N'data', N'Version') IS NULL
    RETURN;

USE data;
我选择此代码并在SQLServerManagementStudio中运行它。结果是:

信息911,16级,状态1,第13行 数据库“数据”不存在。确保输入的名称正确

据我所知,由于我的代码不包含GO,所以应该在一个批处理中完成。由于数据库数据不存在,RETURN语句应该停止执行,USE语句将没有机会运行。但结果根本不是我想的那样。有人能帮忙吗

使现代化 我可以确认我的测试代码在一个批次中。我使用SQL事件探查器捕获SQL:BatchStarting和SQL:BatchCompleted事件,下面是结果

SQL:BatchStarting和SQL:BatchCompleted事件具有相同的SQL文本

USE在编译和执行时都执行并生效 马上

它在编译时执行。这就是原因

USE在编译和执行时都执行并生效 马上


它在编译时执行。这就是原因。

批处理是整个脚本,直到SSMS中的GO批处理终止符,因此SQL:BatchStarting和SQL:BatchCompleted事件显示相同的文本。您需要跟踪SQL:StmtStarting和SQL:StmtCompleted以获得更高的粒度。批处理是整个脚本,直到SSMS中的GO批处理终止符,因此SQL:BatchStarting和SQL:BatchCompleted事件显示相同的文本。您需要跟踪SQL:StmtStarting和SQL:StmtCompleted以获得更大的粒度。嗯,似乎USE语句将始终被执行。没有办法跳过它。谢谢。use语句在编译时被检查,这意味着数据库在编译时甚至在执行之前就必须可用。嗯,use语句似乎总是会被执行的。没有办法跳过它。谢谢。use语句是在编译时检查的,这意味着数据库在编译时甚至在执行之前都必须可用。