最近在看《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中的表变量的更多相关文章

  1. 转载 ORACLE中实现表变量的方法

    源文地址:http://blog.itpub.net/750077/viewspace-2134222/ 经常看到SQLSERVER 中用表变量类型的方式就能做到缓存一个比较大的中间结果, 然后再对这 ...

  2. MSSQL中把表中的数据导出成Insert

    use master go if exists (select name from sysobjects where name = 'sp_generate_insert_script') begin ...

  3. 删除MSSQL中所有表的数据

    CREATE PROCEDURE sp_DeleteAllDataASEXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'EXEC ...

  4. [MSSQL]表变量和临时表的区别

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  5. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  6. SQL知识整理一:触发器、存储过程、表变量、临时表

    触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...

  7. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  8. SqlServer之表变量和临时表

    表变量: 表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名.表变量是变量的一种, 表变量也分为本地及全局的两种,本地表变量的名称都是以"@"为前缀,只有在本地当前 ...

  9. [转]SQL Server 表变量和临时表的区别

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

随机推荐

  1. c++之函数形参和实参

    c++之函数形参和实参讲解 1.非地址型参数 在c++中实现模块化编程时,我们形成会遇到对自定义的函数模块传入参数的操作,即形参.这里主要讲解一个非地址型的形参. 不多说,先看代码: #include ...

  2. leetcode-6-Z字形变换

    题目描述:  将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...

  3. 数据结构:广义表的实现(Java)

    广义表的简单理解在这篇博文中:https://blog.csdn.net/lishanleilixin/article/details/87364496,在此不做赘述. Java实现广义表: pack ...

  4. 树形DP学习笔记

    树形DP 入门模板题 poj P2342 大意就是一群职员之间有上下级关系,每个职员有一个快乐值,但是只有在他的直接上级不在场的情况下才会快乐.求举行一场聚会的快乐值之和的最大值. 求解 声明一个数组 ...

  5. [LibreOJ #2341]【WC2018】即时战略【交互】【LCT】

    Description 有一棵n个点的结构未知的树,初始时只有1号点是已被访问的. 你可以调用交互库的询问函数explore(x,y),其中x是已访问的点,y是任意点. 它会返回x向y方向走第一步的点 ...

  6. Tree-AC训练实录

    Tree-AC比赛记录 2018 ICPC nanjing     Bronze  120/310 ICPC qingdao    Bronze  153/360 2019 ZJPSC        ...

  7. SqlServer子查询、高级

    子查询:把一个结果集让别人继续分析查询的就叫子查询 子查询如果定义了别名,在查询引用时,必须使用别名 --子查询定义了别名,引用就必须用别名 select id,n from Person,(sele ...

  8. java常量类的实现方式_枚举类_项目实践

    前言 众所周知,系统里有很多比如订单状态.审核状态:性别.结算方式.交易类型等属性,这些属性只有几个值,一般用0.1.2.3等的数字标识存入数据库,每次对这些属性所属对象的增删改操作,都会在代码里给状 ...

  9. JDBC处理可滚动的处理集

    Statement createStatement(int resultSetType,                           int resultSetConcurrency,     ...

  10. vuex requires a Promise polyfill in this browser

    ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...