介绍批处理
T-SQL 批处理是客户端作为单个单元提交到 SQL Server 的一个或多个 T-SQL 语句的集合。 SQL Server 在解析、优化和执行代码时,会同时操作批处理中所有的语句。
如果你是通常使用 SELECT 语句而不是过程编写查询的报表编写器,则了解批处理边界仍然很重要。 这些边界会影响你在存储过程和其他例程中使用变量和参数的工作。 例如,必须在引用变量的同一批中声明变量。 因此,识别批处理中包含的内容很重要。
批处理由客户端应用程序分隔。 如何标记批处理的结束取决于客户端的设置。 对于 Microsoft 客户端,包括 SQL Server Management Studio、Azure Data Studio 和 SQLCMD,关键字为 GO。
在此示例中,有两个不同的批处理分别以 GO 结尾:
CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO
批处理终止符 GO 不是 T-SQL 关键字,而是 SSMS 识别的用于指示批处理结束的关键字。
使用 T-SQL 批处理时,请记住两个重要注意事项:
- 批处理是变量范围的边界,这意味着一个批处理中定义的变量只能由同一批中的其他代码引用
- 某些语句(通常为 CREATE VIEW、CREATE FUNCTION 和 CREATE PROCEDURE)的数据定义语句不能与同一批中的其他语句组合在一起。
使用批处理
批处理是提交到 SQL Server 进行分析和执行的 T-SQL 语句的集合。 了解如何分析批处理有助于识别错误消息和行为。 客户端提交批处理时(例如,在 SSMS 中按“执行”按钮时),SQL Server 引擎会分析批处理的语法错误。 找到的任何错误都将导致整个批处理被拒绝;批处理中的声明不会被部分执行。
如果批处理通过语法检查,则 SQL Server 将运行其他步骤,解析对象名称,检查权限,并优化代码以供执行。 此过程完成并开始执行后,每个语句将分别成功或失败。 这是与语法检查的重要对比。 当运行时错误发生在一行时,可能会执行下一行,除非已向代码添加错误处理。
例如,以下批处理包含语法错误:
INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
它提供以下错误消息:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.
错误发生在第 1 行中,但整个批处理被拒绝,不会继续执行第 2 行。 即使将每个 INSERT 语句反转,并在第二行出现语法错误,也不会执行第一行,因为将拒绝整个批次。
使用前面的示例时,此批不包含错误:
INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
在前面的示例中,我们使用了 INSERT 语句,而不是 SELECT 语句,因为修改语句的分组比 SELECT 语句更常见。