我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQL Server中使用表变量和临时表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQL Server中使用表变量和临时表

一、表变量

表变量在SQL Server 2000中首次被引入。

表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用)。

定义表变量的语句是和正常使用Create Table定义表语句的子集。只是表变量通过DECLARE @local_variable语句进行定义。

1、定义和使用表变量

定义一个表变量,插入一条数据,然后查询:

DECLARE @tb1 Table
  (
   Id int,
   Name varchar(20),
   Age int
  )

INSERT INTO @tb1 VALUES(1,'刘备',22)

SELECT * FROM @tb1

输出结果如下:

2、表变量不能做如下事情:

来试试一些不符合要求的情况,例如添加表变量后,添加约束,并对约束命名:

ALTER TABLE @tb1 ADD CONSTRAINT CN_AccountAge
    CHECK 
    (Account_Age > 18);    -- 插入年龄必须大于18

  SQL Server提示错误如下:

SQL Server不支持定义表变量时对Constraint命名,也不支持定义表变量后,对其建Constraint。

更多的不允许,请查看下面的要求。

  • 虽然表变量是一个变量,但是其不能赋值给另一个变量。
  • check约束,默认值和计算列不能引用自定义函数。
  • 不能为约束命名。
  • 不能Truncate表变量。
  • 不能向标识列中插入显式值(也就是说表变量不支持SET IDENTITY_INSERT ON)

3、表变量的特征:

  • 表变量拥有特定作用域(在当前批处理语句中,但不在任何当前批处理语句调用的存储过程和函数中),表变量在批处理结束后自动被清除。
  • 表变量较临时表产生更少的存储过程重编译。
  • 针对表变量的事务仅仅在更新数据时生效,所以锁和日志产生的数量会更少。
  • 由于表变量的作用域如此之小,而且不属于数据库的持久部分,所以事务回滚不会影响表变量。

表变量可以在其作用域内像正常的表一样使用。更确切的说,表变量可以被当成正常的表或者表表达式一样在SELECT,DELETE,UPDATE,INSERT语句中使用,但是表变量不能在类似"SELECT select_list INTO table_variable"这样的语句中使用。而在SQL Server2000中,表变量也不能用于INSERT INTO table_variable EXEC stored_procedure这样的语句中。

二、临时表

在深入临时表之前,我们要了解一下会话(Session),一个会话仅仅是一个客户端到数据引擎的连接。在SQL Server Management Studio中,每一个查询窗口都会和数据库引擎建立连接。

一个应用程序可以和数据库建立一个或多个连接,除此之外,应用程序还可能建立连接后一直不释放知道应用程序结束,也可能使用完释放连接需要时建立连接。

临时表和Create Table语句创建的表有着相同的物理工程,但临时表与正常的表不同之处有:

  • 临时表的名称不能超过116个字符,这是由于数据库引擎为了辨别不同会话建立不同的临时表,所以会自动在临时表的名字后附加一串。
  • 局部临时表(以"#"开头命名的)作用域仅仅在当前的连接内,从在存储过程中建立局部临时表的角度来看,局部临时表会在下列情况下被Drop:
      a、显示调用Drop Table语句
      b、当局部临时表在存储过程内被创建时,存储过程结束也就意味着局部临时表被Drop。
      c、当前会话结束,在会话内创建的所有局部临时表都会被Drop。
  • 全局临时表(以"##"开头命名的)在所有的会话内可见,所以在创建全局临时表之前首先检查其是否存在,否则如果已经存在,你将会得到重复创建对象的错误。
      a、全局临时表会在创建其的会话结束后被Drop,Drop后其他会话将不能对全局临时表进行引用。
      b、引用是在语句级别进行
  • 不能对临时表进行分区。
  • 不能对临时表加外键约束。
  • 临时表内列的数据类型不能定义成没有在TempDb中没有定义自定义数据类型(自定义数据类型是数据库级别的对象,而临时表属于TempDb)。
    由于TempDb在每次SQL Server重启后会被自动创建,所以你必须使用startup stored procedure来为TempDb创建自定义数据类型。你也可以通过修改Model数据库来达到这一目标。
  • XML列不能定义成XML集合的形式,除非这个集合已经在TempDb中定义。

临时表既可以通过Create Table语句创建,也可以通过"SELECT <select_list> INTO #table"语句创建。你还可以针对临时表用"INSERT INTO #table EXEC stored_procedure"这样的语句。
临时表可以拥有命名的约束和索引。但是,当两个用户在同一时间调用同一存储过程时,将会产生”There is already an object named ‘<objectname>’ in the database”这样的错误。所以最好的做法是不用为建立的对象进行命名,而使用系统分配的在TempDb中唯一的。

1、全局临时表引用是在语句级别进行

如:

1.新建查询窗口,运行语句:

CREATE TABLE ##temp(RowID int)
INSERT INTO ##temp VALUES(3)

2.再次新建一个查询窗口,每5秒引用一次全局临时表

While 1=1 
  BEGIN
    SELECT * FROM ##temp
    WAITFOR delay '00:00:05'
  END

3.回到第一个窗口,关闭窗口。
4.下一次第二个窗口引用时,将产生错误。

三、比较

微软推荐使用表变量,如果表中的行数非常小,则使用表变量。

临时表和表变量有很多类似的地方。所以有时候并没有具体的细则规定如何选择哪一个。对任何特定的情况,你都需要考虑其各自优缺点并做一些性能测试。

下面的表格会让你比较其优略有了更详细的参考。

特性表变量临时表
作用域当前批处理当前会话,嵌套存储过程,
全局:所有会话
使用场景自定义函数,存储过程,批处理自定义函数,存储过程,批处理
创建方式只能通过DECLEARE语句创建

CREATE TABLE 语句

SELECT INTO 语句.

表名长度最多128字节最多116字节
列类型

可以使用自定义数据类型

可以使用XML集合

自定义数据类型和XML集合必须在TempDb内定义
Collation字符串排序规则继承自当前数据库字符串排序规则继承自TempDb数据库
索引索引必须在表定义时建立索引可以在表创建后建立
约束PRIMARY KEY, UNIQUE, NULL, CHECK约束可以使用,但必须在表建立时声明PRIMARY KEY, UNIQUE, NULL, CHECK. 约束可以使用,可以在任何时后添加,但不能有外键约束
表建立后使用DDL (索引,列)不允许允许.
数据插入方式INSERT 语句 (SQL 2000: 不能使用INSERT/EXEC).

INSERT 语句, 包括 INSERT/EXEC.

SELECT INTO 语句.

Insert explicit values into identity columns (SET IDENTITY_INSERT).不支持SET IDENTITY_INSERT语句支持SET IDENTITY_INSERT语句
Truncate table不允许允许
析构方式批处理结束后自动析构显式调用 DROP TABLE 语句.  当前会话结束自动析构 (全局临时表: 还包括当其它会话语句不在引用表.)
事务只会在更新表的时候有事务,持续时间比临时表短正常的事务长度,比表变量长
存储过程重编译会导致重编译
回滚不会被回滚影响会被回滚影响
统计数据不创建统计数据,所以所有的估计行数都为1,所以生成执行计划会不精准创建统计数据,通过实际的行数生成执行计划。
作为参数传入存储过程仅仅在SQL Server2008, 并且必须预定义 user-defined table type.不允许
显式命名对象 (索引, 约束).不允许允许,但是要注意多用户的问题
动态SQL必须在动态SQL中定义表变量可以在调用动态SQL之前定义临时表

到此这篇关于SQL Server中使用表变量和临时表的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQL Server中使用表变量和临时表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SQL Server中使用表变量与临时表的差异及适用场景

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。sql server
SQL Server中使用表变量与临时表的差异及适用场景
2024-06-04

SQLSERVER临时表和表变量的区别汇总

不管临时表还是表变量都带了表这个词,既然提到表,按推理自然会落到某数据库中,如果真在一个数据库中,那自然就有它的存储文件.mdf和.ldf,那是不是如我推理的那样呢,这篇文章主要介绍了SQLSERVER临时表和表变量到底有什么区别,需要的朋友可以参考下
2023-02-16

SQLSERVER 临时表和表变量的区别汇总

目录一:背景1. 讲故事二:到底有什么区别1. 前置思考2. 如何验证都存储在 tempdb 中 ?3. 不同点在哪里三:总结一:背景1. 讲故事今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表 和 表变量 这俩玩意,如果有朋
2023-02-16

sql临时表怎么创建和使用

在SQL中,可以使用CREATE TABLE语句来创建临时表。临时表是在当前会话中存在的表,一旦会话结束,临时表就会自动被删除。创建临时表的语法如下:CREATE TEMPORARY TABLE table_name (column1
sql临时表怎么创建和使用
2024-04-09

变量在Oracle数据库临时表使用中的优化

在Oracle数据库中,临时表(Temporary Table)是一种用于存储临时数据的特殊表,它们通常被用于在会话期间存储中间结果或临时数据。在使用临时表时,为了提高查询性能和减少资源消耗,可以考虑以下优化方法:尽量避免在临时表中创建索引
变量在Oracle数据库临时表使用中的优化
2024-08-23

sql语句中临时表使用实例详解

目录一、临时表实现分步处理1.概述2.实例2.1表格结构2.2需求2.3sql语句2.4sql语句解析二、临时表实现分层处理1编程、概述2、实例2.1表结构2.2需求2.3sql语句2.4sql语句解析一、临时表实现分步处理1.概述当需
2023-02-16

sql存储过程中临时表怎么使用

在SQL存储过程中,可以使用临时表来存储中间结果或者临时数据。以下是使用临时表的一般步骤:1. 创建临时表:在存储过程的开始部分,使用CREATE TABLE语句创建临时表。临时表可以使用#作为表名的前缀,表示它是一个局部临时表。例如:CR
2023-08-23

如何使用视图和临时表简化SQL拼接

视图和临时表是在SQL中用来简化数据查询和数据处理的工具。通过视图和临时表,可以将复杂的SQL查询拆分为多个简单的部分,使得代码更加清晰、易于维护和重用。以下是使用视图和临时表简化SQL拼接的一些方法:使用视图:视图是一个虚拟的表,可以像表
如何使用视图和临时表简化SQL拼接
2024-04-29

如何在PostgreSQL中使用视图和临时表

在 PostgreSQL 中,可以使用视图和临时表来简化查询和管理数据。创建视图:视图是一种虚拟表,它是基于查询结果的可视化表。您可以将复杂的查询结果存储在视图中,并在需要时直接从视图中检索数据。要创建视图,请使用 CREATE VIEW
如何在PostgreSQL中使用视图和临时表
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录