MSSQL中的表变量
最近在看《Microsoft SQL Server2005技术内幕:T-SQL程序设计》
1、表变量的事务上下文中提到,表变量不受外部事务回滚影响。
举个例子:
DECLARE @TA TABLE(col INT);
INSERT @TA VALUES(0);
SELECT * FROM @TA;
BEGIN TRAN
INSERT @TA VALUES(1);
SELECT * FROM @TA;
ROLLBACK;
SELECT * FROM @TA;
/*--------------------------------------------*/
第一个SELECT输出结果:
col
/*--------------------------------------------*/
第二个SELECT输出结果:
col
/*--------------------------------------------*/
第三个SELECT输出结果:
col
/*--------------------------------------------*/
原文中举了一个例子,概括起来就是如果在触发器(inserted/deleted)中回滚数据变更,但又想记录这些变更,怎么做呢?可以把inserted/deleted中的变更数据保存到表变量中,然后事务回滚数据变更操作。
作者还提到,利用表变量这个特性,不仅可以记录修改后撤销的数据,而且对比临时表(临时表会产生日志操作和锁操作,但涉及的锁比数据表少),可以减少日志操作和锁操作。
2、使用表变量时候的限制条件
1)表变量只能创建主键key和唯一索引,不支持非唯一索引。如果需要把某个非主键字段col1构建为索引,可以将key和col1构建成一个主键key。比如说,产品表变量@Product,主键为Id_Guid,现在需要将@Product中的产品编码字段Code_Nvarchar字段加入索引,可以将(Id_Guid,Code_Nvarchar)构建为主键Key
2)表变量创建之后,就不能修改它的结构。比如说创建了表变量@Product(Id_Guid,Code_Nvarchar)之后,就不能为@Product再添加或者删除一个字段。表变量的这个限制条件也可以减少编译次数。(表的架构更改之后会导致重新编译)
3)表变量中,不能以表名.列表的方式来访问列。比如不能用@Product.Id_Guid来访问表变量@Product的Id_Guid字段。
DECLARE @TA TABLE(col INT);
DECLARE @TB TABLE(col INT);
INSERT @TA VALUES(1);
INSERT @TB VALUES(1);
SELECT * FROM @TA A JOIN @TB B ON(A.col=B.col);
/*下面这个语句会报语法错误*/
--SELECT * FROM @TA JOIN @TB ON(@TA.col=@TB.col);
4)在修改表变量的查询中,不使用并行执行计划。
MSSQL中的表变量的更多相关文章
- 转载 ORACLE中实现表变量的方法
源文地址:http://blog.itpub.net/750077/viewspace-2134222/ 经常看到SQLSERVER 中用表变量类型的方式就能做到缓存一个比较大的中间结果, 然后再对这 ...
- MSSQL中把表中的数据导出成Insert
use master go if exists (select name from sysobjects where name = 'sp_generate_insert_script') begin ...
- 删除MSSQL中所有表的数据
CREATE PROCEDURE sp_DeleteAllDataASEXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'EXEC ...
- [MSSQL]表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- SQL知识整理一:触发器、存储过程、表变量、临时表
触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...
- SQL Server 表变量和临时表的区别
SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...
- SqlServer之表变量和临时表
表变量: 表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名.表变量是变量的一种, 表变量也分为本地及全局的两种,本地表变量的名称都是以"@"为前缀,只有在本地当前 ...
- [转]SQL Server 表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
随机推荐
- Solr7.4的学习与使用
学习的原因: 17年的时候有学习使用过lucene和solr,但是后来也遗忘了,最近公司有个项目需要使用到全文检索,正好也顺便跟着学习一下,使用的版本是Solr7.4的,下载地址:http://arc ...
- leetcode-209-长度最小的子数组
题目描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...
- leetcode-74-搜索二维矩阵
题目描述: 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: ...
- SDN定义网络
http://edu.51cto.com/course/course_id-4466.html http://edu.51cto.com/course/course_id-4497.html
- 【转载】SSAS-MDX#001 - MDX 基本结构
1. MDX 的基本结构 - MDX 的基本结构有三种: Members, Tuple 和 Set 2. Members - 指的是维度树上的一个节点, 这里有一点需要指出, 量度也是一个特殊的 ...
- Q239 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: 输入: nums ...
- 怎么搭建一个5T的私有云盘
视频 点击打开视频 下载地址 免费域名网址: https://www.freewebhostingarea.com/ ftp工具: http://t.cn/EXWxYUI oneindex: http ...
- JDBC处理可滚动的处理集
Statement createStatement(int resultSetType, int resultSetConcurrency, ...
- orcale 之pl/sql例外
orcale 中的例外我们可以看作是其他编程语言中的异常,是为了增强语言的健壮性和容错性. 在orcale中常见的有以下几种: No_data_found 很容易理解就是没有数据返回. Too_man ...
- linux安装QQ截图
本人(壮壮熊)现用系统是ubuntu 12.04 相信用过linux系统的朋友都知道,linux下的截图软件是在不咋的.虽然系统本身有带截图工具,但是却苦于没有办法在截下来的图片上作画圈.写文字说明等 ...