T-SQL 批处理

批处理简介

  批处理是作为一个逻辑单元的T-SQL语句。如果一条语句不能通过语法分析,那么不会运行任何语句。如果一条语句在运行时失败,那么产生错误的语句之前的语句都已经运行了。

  为了将一个脚本分为多个批处理,可使用GO语句。

  GO语句的特点:

  •   GO语句必须自成一行,只有注释可以再同一行上。
  •   它使得自脚本的开始部分或者最近一个GO语句以后的所有语句编译成一个执行计划并发送到服务器,与任何其他批处理无关。
  •   GO语句不是T-SQL命令,而是由各种SQL Server命令实用程序(如:Management Studio中的"查询"窗口)识别的命令。

  1、自成一行

  GO命令应当自成一行。在技术上,可以在GO命令之后的同一行开始一个新的批处理,但是这会严重影响可读性。T-SQL语句不能放在GO语句之前,否则GO语句经常会被错误地理解,从而造成语法分析错误或产生一些不可预料的后果。例如,在WHERE子句之后使用一个GO语句。

  SELECT * FROM Person WHERE Id = 100 GO

  分析器就不知道如何处理。

  消息 102,级别 15,状态 1,第 1 行
  ‘GO‘ 附近有语法错误。

  2、每个批处理单独发送到服务器

  因为每个批处理被单独地处理,所以一个批处理中的错误不会阻止另一个批处理运行。要说明这点,请看一下下面的代码。

  SELECT 1/0
  GO
  SELECT 0/1

  如果这些批处理之间没有任何依赖性,则每个批处理在运行时是完全自治的。

  消息 8134,级别 16,状态 1,第 1 行
  遇到以零作除数错误。

  (1 行受影响)

  如果这些批处理之间存在依赖性,那么错误发生之后的每个批处理都会失败。依赖性指的是后面的语句,依赖前面执行的结果或变量等等。  

  3、GO不是T-SQL命令

  一个常见的错误是认为GO是T-SQL命令,其实GO是一个只能被编辑工具(Management Studio)识别的命令。

  当编辑工具遇到GO语句时,会将GO语句看做一个终止批处理的标记,将其打包,并且作为一个独立的单元发送到服务器,不包括GO。因为服务器本身根本不知道GO是什么意思。

批处理中错误

  批处理中的错误分为以下两类:

  •   语法错误
  •   运行时错误

  如果查询分析器发现一个语法错误,那么批处理的处理过程会被立即取消。因为语法检查发生在批处理编译或者执行之前,所以在语法检查期间的一个失败意味着还没有批处理被执行-不管语法错误发生在批处理中的什么位置。

  运行时错误的工作方式有很大不同,因为任何在遇到运行时错误之前执行的语句已经完成了,所以除非是未提交事务的一部分,否则这些语句所做的任何事情都已经是现实了。

  一般而言,运行时错误将终止从错误发生的地方到此批处理末端的批处理的执行。下一个批处理不影响。

何时使用批处理

  使用批处理有若干个理由,但是所有的批处理都有一个共同点-当脚本中的一些事情必须发生在另外一件事情之前或者分开发生时,需要使用批处理。

  1.要求有自己的批处理的语句

  有一些命令必须有他们自己的批处理。

  •   CREATE DEFAULT
  •   CREATE PROCEDURE
  •   CREATE RULE
  •   CREATE TRIGGER
  •   CREATE VIEW

  如果想在单个脚本中将这些语句中的任意一个和其他语句进行组合,那么需要通过使用GO语句将他们分散到各自的批处理中。

  2、使用批处理建立优先权

  当需要建立优先权时,就可能用到批处理。也就是说,在下一个任务开始之前,需要全部完成上一个任务。在大多数时候,SQL Server可以很好地处理这种情况 - 脚本中的第一条语句是首先执行的,并且脚本中的第二条语句可以依赖第二条语句运行时服务器所处的适当状态。

  下面来看一个例子:

  USE master

  CREATE DATABASE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

  当执行上面的脚本,提示命令已成功完成。但是真的没问题吗?

  当查看Test数据库时,发现表TestTable并不存在,反而master数据库里多了一个TestTable表。

  为什么表被创建在了master数据库中,答案取决于当运行CREATE TABLE语句时,当前数据库是什么。在这个例子中,它恰好是master数据库,所以表就创建在该数据库中。

  你可能以为将上述代码改成这样可能就能够解决:

  CREATE DATABASE Test

  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

  但很遗憾,并不能,错误信息如下:

  消息 911,级别 16,状态 1,第 3 行
  数据库 ‘Test‘ 不存在。请确保正确地输入了该名称。

  分析器尝试验证代码时,发现USE引用一个不存在的数据库,这是批处理语句不可或缺,正确的代码如下:

  CREATE DATABASE Test
  GO  --此GO是两主角
  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

  就这样加了一个GO之后,问题成功解决。

  下面再来看一个例子:

  USE Test
  ALTER TABLE TestTable
      ADD col3 int
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)

  以上代码在查询分析器中提示col3列不存在。实际上,以上代码也可以通过一个GO解决。

  USE Test
  ALTER TABLE TestTable
      ADD col3 int
  GO  --先更改数据库,然发送插入,此时就是分开进行语法验证了
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)
时间: 2024-10-10 09:43:27

T-SQL 批处理的相关文章

SQL批处理的即时结果的特性

优点: SQL批处理的即时结果的特性,直接可以看出插入.修改.删除了哪些数据,而不用中间语言(C#\Java\Python\Ruby)去比较信息,对用户调试,特别是对于几 千上万用户信息的情况尤其有利. 缺点: 下面标红的地方. 在这里其实,所有工作都已经完成了,如果有兴趣,可以往下看. http://cdkf111.noobay.com/news/itemid-355410.shtmlhttp://cdkf111.noobay.com/news/itemid-355409.shtmlhttp:

39. SQL -- 批处理及流程控制语句(1)

批处理及流程控制语句 批处理:(批处理语句,简称批语句): 是一组一起提交给SQL Server执行的SQL语句.当执行批处理语句的时候,SQL Server将批处理语句编译到一个称之为执行计划的可执行单元这有助于节省执行时间! 假如您必须执行10个SQL语句且你正在一个个的发送10个请求并执行它们,这个过程很浪费时间.且他们不能一起被执行!但你可以在一个批处理中执行所有的这10个SQL语句,且执行过程将变得很快,因为所有的SQL语句都一起被发送到SQL Server的服务器! 创建批处理语句:

40. SQL -- 批处理及流程控制语句(2)

  CASE语句 CASE函数可以计算多个条件式,并将其中一个符合条件的结果表达式返回.CASE函数按照使用形式的不同,可以分为简单CASE函数和搜索CASE函数. 简单CASE 函数将某个表达式与一组简单表达式进行比较以确定结果. CASE 搜索函数计算一组布尔表达式以确定结果. 简单CASE函数: 简单CASE表达式将一个测试表达式与一组简单表达式进行比较,如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式的值.When子句提供测试值,并将When子句所指定的结果表达式返回.测试表

sql 批处理、获取自增长、事务、大文本处理

批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保存 (批量保存) } Public void save(Admin admin ){ // 循环 // 保存 } 技术: |-- Statement 批处理相关方法 void addBatch(String sql) 添加批处理 void clearBatch() 清空批处理 int[] executeB

SQL SERVER 简介及应用 - 数据库系统原理

SQL SERVER 是一个分布式的关系型数据库管理系统(RDBMS),具有客户 - 服务器体系结构,一般发行的版本有企业版.标准版.个人版.开发版. SQL SERVER 提供的服务 MS SQL Server:运行 SQL Server 的服务. SQL Server Agent:管理 SQL Server 周期性行为的安排,并在发生错误时通知系统管理员. Microsoft Server Service:提供一个全文本索引和搜索引擎. MS DTC:管理包含不同数据源的事务. SQL SE

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式-上篇 [T-SQL基础]04.表表达式-下篇 [T-SQL基础]05.集合运算 [T-SQL基础]06.透视.逆透视.分组集 [T-SQL基础]07.数据修改 [T-SQL基础]08.事务和并发 [

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执

四项技术 助你提高SQL Server的性能

有时,为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整.但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的 SQL 查询不能按照您想要的方式进行响应.它要么不返回数据,要么耗费的时间长得出奇.如果它降低了企业应用程序的速度,用户必须等待很长时间.用户希望应用程序响应迅速,他们的报告能够在瞬间之内返回分析数据.就我自己而言,如果在Web上冲浪时某个页面要耗费十多秒才能加载,我也会很不耐烦. 为了解决这些问题,重要的是找到问题的根源.那么,从哪里开始呢?根本原因通常

SQL Server 动态管理视图(DMVs)

DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限   和事务有关的DMV sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的事务有关的信息. sys.dm_tran_database_transactions:返回有关用户数据库级事务的信息. sys.dm_tran_locks:返回有关当前处于活动状态的锁管理器资源的信息.向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行.结果集中的列大体分为两组:资