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)
T-SQL批处理的更多相关文章
- SQL批处理与事务控制
今天我想要分享的是关于数据库的批处理与事务的控制.批处理对于项目的实际应用有非常大的具体意义. 一.批处理部分 首先我们新建一个表: create table t3( id int primary k ...
- PL/SQL批处理语句(二)FORALL
PL/SQL批处理语句(二)FORALL 我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换, ...
- 玩转Spring全家桶笔记 03 Spring的JDBC操作以及SQL批处理的实现
1 spring-jdbc core JdbcTemplate 等相关核心接口和类(核心) datesource 数据源相关的辅助类(内嵌数据源的初始化) object 将基本的JDBC操作封装成对象 ...
- sql 批处理、获取自增长、事务、大文本处理
批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...
- PL/SQL批处理语句(BULK COLLECT子句和FORALL语句)
Oracle为PL/SQL中的SQL相关功能提供了FORALL语句和BULK COLLECT子句,显著的增强了SQL相关功能.这两个语句一起被称作PL/SQL的批处理语句.Oracle为什么要提供这两 ...
- sql批处理(batch)的简单使用
批处理指的是一次操作中执行多条SQL语句,相比于一次一次执行效率会提高很多 批处理主要是分两步: 将要执行的SQL语句保存 执行SQL语句 Statement和PreparedStatement都支持 ...
- Sql批处理语句
同时写3个批处理,如果前2个批处理没有问题,最后一个有错误那么3个批处理都不会执行需要注意列如: use Materl GO select * from t_icitem GO inset into ...
- PL/SQL批处理语句(一)BULK COLLECT
我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销.然而,FORA ...
- ADO.NET 中可以发送包含多个SQL语句的批处理脚本到SQL Server,但是用MySQL的ODBC驱动不行
众所周知,我们在ADO.NET中可以使用NuGet包System.Data.SqlClient来操作SQL Server,并且ADO.NET是支持向SQL Server发送包含多个SQL语句的批处理脚 ...
- 解决sql server中批处理过程中“'CREATE/ALTER PROCEDURE 必须是查询批次中的第一个语句”
在批处理中加字段或表或视图或存储过程是否存在的判断 -----------------------------------------line----------------------------- ...
随机推荐
- SQL:存储过程
1/什么是存储过程及概念 Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可 ...
- http协议 put、delete请求asp.net mvc应用,报404错误
http协议 put.delete请求asp.net mvc应用,报404错误 更改web.config,在<modules>节点中设置 runAllManagedModulesForAl ...
- 清空控件的TeXt属性
foreach (Control item in groupBox1.Controls) { if (item is TextBox) //判断控件是不是TextBox { item.Text = & ...
- asp,对待绑定数据加序号列(DataSet)
string sql_sel = "select InS.ID as isID, InS.InventorySize , InS.MinValue,InS.MaxValue from Inv ...
- C# 请求Https
/// <summary> /// Get请求 /// </summary> /// <param name="Url"></param& ...
- 数据库连接池之C3P0
一.C3P0的使用步骤 1:导入相关的依赖jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar 2:代码实现 A:硬编码的实现方式 package ...
- java util 中set,List 和Map的使用
https://www.cnblogs.com/Lxiaojiang/p/6231724.html 转载
- 内嵌Jetty输出debug日志
Slf4jLog logger = new Slf4jLog(); logger.setDebugEnabled(true); Log.setLog(logger); log4j2.xml中配置如下章 ...
- python模块之numpy与pandas
一.numpy numpy是python数据分析和机器学习的基础模块之一.它有两个作用:1.区别于list列表,提供了数组操作.数组运算.以及统计分布和简单的数学模型:2.计算速度快[甚至要由于pyt ...
- InfluxDB 的卸载与重装
我是通过下面方式安装的,所以卸载也是用的 rpm 的卸载命令 wget http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm su ...