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约束(外键约 ...
随机推荐
- leetcode-733-Flood Fill
题目描述: An image is represented by a 2-D array of integers, each integer representing the pixel value ...
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建
armv7,armv7s,arm64,i386,x86_64 详解 一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错 ...
- Linux 线程调度策略与线程优先级
Linux内核的三种调度策略 SCHED_OTHER 分时调度策略. 它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的.简单地说,如果系统使用这种调度策略,程序将无 ...
- 【算法笔记】A1071 Speech Patterns
1071 Speech Patterns (25 分) People often have a preference among synonyms of the same word. For ex ...
- php 根据子分类循环获取其父级分类
/** * 根据子分类循环获取其父级分类 */ function goodsCatPath($catId, $data = []){ if($catId==0)return $data; $data[ ...
- [Re:从零开始的分布式] 0.x——分布式锁概述
为什么需要分布式锁 Martin Kleppmann是英国剑桥大学的分布式系统的研究员,Martin认为一般我们使用分布式锁有两个场景: 效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪 ...
- weiFenLuo.winFormsUI.Docking.dll学习
引用方法: 1.建立一个WinForm工程,默认生成了一个WinForm窗体. 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll. 3 ...
- Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法
Apple的系统升级终于免费了,可开心满满地升级到OS X Mavericks后,Android模拟器之王Genymotion罢工了.遇到两个问题:1. Unable to load VirtualB ...
- IE8下不识别indexOf的问题
1.为Array原型添加indexOf方法(如果学过面向对象,相当于给Array类添加实例方法),方法体如下: //添加数组IndexOf方法 if (!Array.prototype.indexOf ...
- git 学习之撤销和删除
在实际的工作和学习中我们经常的会对文件进行修改,但是或多或少的就会发现由于某些原因修改是错误的这时候就需要对所做的修改进行撤销,更或者某些时候需要对文件进行删除.本节就会告诉大家如何操作. 撤销操作 ...