SQL Server临时表和表变量

sql server 表变量和临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL 阅读详情

文章主要描述的是SQL Server临时表和表变量在实际操作中的区别介绍,我们在数据库中实际操作中,对于表的使用的时候,一般都会使用两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们。

虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用SQL Server临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?

临时表

临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

临时表分为本地和全局两种,本地SQL Server临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局SQL Server临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除。

下面我们来看一个创建SQL Server临时表的例子:

 
  1. CREATE TABLE dbo.#News   
  2. (   
  3. News_id int NOT NULL,   
  4. NewsTitle varchar(100),   
  5. NewsContent varchar(2000),   
  6. NewsDateTime datetime   
  7. )  

临时表可以创建索引,也可以定义统计数据,所以可以用数据定义语言(DDL)的声明来阻止临时表添加的限制,约束,并参照完整性,如主键和外键约束。比如来说,我们现在来为#News表字段NewsDateTime来添加一个默认的GetData()当前日期值,并且为News_id添加一个主键,我们就可以使用下面的语句: 

 
  1. ALTER TABLE dbo.#News   
  2. ADD   
  3. CONSTRAINT [DF_NewsDateTime] DEFAULT (GETDATE()) FOR [NewsDateTime],   
  4. PRIMARY KEY CLUSTERED   
  5. (   
  6. [News_id]   
  7. ) ON [PRIMARY]   
  8. GO  

SQL Server临时表在创建之后可以修改许多已定义的选项,包括:

1)添加、修改、删除列。例如,列的名称、长度、数据类型、精度、小数位数以及为空性均可进行修改,只是有一些限制而已。

2)可添加或删除主键和外键约束。

3)可添加或删除 UNIQUE 和 CHECK 约束及 DEFAULT 定义(对象)。

4)可使用 IDENTITY 或 ROWGUIDCOL 属性添加或删除标识符列。虽然 ROWGUIDCOL 属性也可添加至现有列或从现有列删除,但是任何时候在表中只能有一列可具有该属性

5)表及表中所选定的列已注册为全文索引。

表变量

表变量创建的语法类似于SQL Server临时表,区别就在于创建的时候,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。

如我们看看创建表变量的语句:

 
  1. DECLARE @News Table   
  2. (   
  3. News_id int NOT NULL,   
  4. NewsTitle varchar(100),   
  5. NewsContent varchar(2000),   
  6. NewsDateTime datetime   
  7. )  

比较临时表及表变量都可以通过SQL的选择、插入、更新及删除语句,它们的的不同主要体现在以下这些:

1)表变量是存储在内存中的,当用户在访问表变量的时候,SQL Server是不产生日志的,而在临时表中是产生日志的;

2)在表变量中,是不允许有非聚集索引的;

3)表变量是不允许有DEFAULT默认值,也不允许有约束;

4)临时表上的统计信息是健全而可靠的,但是表变量上的统计信息是不可靠的;

5)SQL Server临时表中是有锁的机制,而表变量中就没有锁的机制。

我们现在来看一个完整的例子,来看它们的用法的异同:

利用临时表

 
  1. CREATE TABLE dbo.#News   
  2. (   
  3. News_id int NOT NULL,   
  4. NewsTitle varchar(100),   
  5. NewsContent varchar(2000),   
  6. NewsDateTime datetime   
  7. )   
  8. INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)   
  9. VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())   
  10. SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News   
  11. DROP TABLE dbo.[#News]  

利用表变量 

 
  1. DECLARE @News table   
  2. (   
  3. News_id int NOT NULL,   
  4. NewsTitle varchar(100),   
  5. NewsContent varchar(2000),   
  6. NewsDateTime datetime   
  7. )   
  8. INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)   
  9. VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())   
  10. SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News  

我们可以看到上面两种情况实现的是一样的效果,第一种利用临时表的时候,临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建,而定义表变量也不需要进行DROP Table的操作,一次执行完成后就会消失。

其实在选择临时表还是表变量的时候,我们大多数情况下在使用的时候都是可以的,但一般我们需要遵循下面这个情况,选择对应的方式:

1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。

2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用SQL Server临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

注:表变量虽然不支持索引,但是表变量支持主键阿,所以可以利用主键来替代索引。

注:由于表变量不支持统计数据,因此在一个存储过程中使用表变量可以减少由于数据变化而导致的重新编译问题。

注:表变量同时也不支持并行执行计划,因此对于大型的临时结果集,表变量也不是一个好的选择

对于函数中不能支持SQL Server临时表是由于函数不能对函数作用域外部的资源状态造成永久性的更改,在SQLServer中也称为副作用(sideeffect)。不过如果在函数中使用大型的临时结果集是不推荐的,因为如果将这样的函数放置到一个查询中会造成很明显的性能问题,因此这种情况一般都采用存储过程之类的批处理脚本。

对于动态脚本不支持表变量的原因是因为存储过程不接受表类型的参数。不过如果表变量的声明和赋值都在sp_executesql的参数中的话,sp_executesql就可以执行了,因为这个时候表变量就存在sp_executesql的stmt参数里面,不需要传入,例如下面的代码:(当然这样的实用性也就没有多少了)

 
  1. DECLARE @m nvarchar(max)  
  2. SET @m = N"DECLARE @t TABLE (ID int);INSERT INTO @tVALUES(1);SELECT * FROM @t T" 
  3. EXEC sp_executesql @m  
http://database.51cto.com/art/201007/213670.htm
SQL Server 临时表、表变量与WITH语句的用法与区别 SQL Server 数据处理中,临时表、表变量和 CTE 是三大中间结果集工具。临时表适合大数据操作(10万+行),支持索引和事务;表变量内存优先,千行内操作比临时表快3-5倍;CTE 则简化复杂查询逻辑,支持递归处理。选型需考虑数据量、事务需求和代码可读性:小数据用表变量,大数据选临时表,复杂查询优先 CTE。测试表明,临时表10万行插入耗时1.2秒,表变量千行聚合比临时表快3倍,CTE 多表连接比子查询快40%。关键在于根据实际执行计划灵活选择。 阅读详情

相关推荐

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4313

SQL Server临时表和表变量在操作中有哪些不同之处?

<br />文章主要描述的是SQL Server临时表和表变量在实际操作中的区别介绍,我们在数据库中实际操作中,对于表的使用的时候,一般都会使用两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们。<br />虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用SQL Server临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?<br />临时表<br />临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后

顾丽江的专栏 708

利用ArcGIS的模型构建器实现批量投影栅格和批量克里金插值

博主要批量投影几百个栅格,但是ArcGIS中的投影栅格的批处理工具需要手动一条条设置参数,还是麻烦,因此学习了使用模型构建器(ModelBuilder)来批量投影栅格,可以导入需投影栅格的文件夹,然后迭代投影,并按栅格原名逐个输出到指定目录。 1.在工具箱里构建模型 在arctool box里右键点击空白处,选择【添加工具箱】,点击ArcGIS默认工作目录的工具箱进行添加,然后Toolbox就会被添加到ArcToolbox页面,右键点击Toolbox,选择“新建”-“模型” 2.编写模型 (1).

qq_36958801的博客 1万+

SQL Server最全数据表管理(字段的数据类型、临时表、设置标识字段、使用默认值、创建约束、修改表)

目录   一、字段的数据类型——实例: 二、临时表 三、设置标识字段  四、使用默认值 五、创建约束 六、修改表 一、字段的数据类型——实例: 创建一个新表(如图)  当然我们也可以就所设计的表进行修改:   我们还可以单击鼠标右键进行新建表   二、临时表 临时表:是临时创建的,不能永久保存的表,临时表可以分为本地临时表和全局临时表。 本地临时表:以单个数...

王华春_Jason 3288

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 453

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试

前面CODESY下载安装并熟悉了,p-net搭建从站也已经跑在虚拟机树莓派上了,我们只需要快速搭建一个profinet主站来和从站进行交互即可,这里我们直接用Windows下带的软PLC搭建profinet主站并和p-net的demo从站程序进行IO交互。评估是否进行Windows下的运行时PLC前先看一下注意事项,Windows下安装配置会需要修改boot及防火墙等,可能会影响Windows电脑的正常使用,所以创建项目时的设备可以选择非RTE的。

逍遥游的博客 7313

sqlserver--用sql脚本创建表索引

- 示例:为表 customers 添加一个名为 idx_customers_city_state 的联合索引,该索引基于 city 和 state 两列。-- 示例:为表 employees 添加一个名为 idx_employees_age 的索引,该索引基于 age 列。-- 语法:CREATE INDEX index_name ON table_name (column_name)-- 示例:为表 customers 添加基于 city 和 state 列的非聚集联合索引。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1879

Kettle入门指南:从安装到数据转换实战

本文提供Kettle(Pentaho Data Integration)的完整入门指南,涵盖从Java环境安装、软件配置到核心概念(转换与作业)的详细解析。通过实战案例,手把手教你如何将文本文件数据导出到Excel,并连接MySQL数据库进行数据导入,帮助你快速掌握这一强大ETL工具的基本使用,实现高效数据搬运与转换。

weixin_29266647的博客 449

SqlServer为大数据量表建索引

之前从没有用SqlServer数据库处理过大数据量的表,都是用Oracle,然后一般为数据量较大的表添加索引或主键都是用plsql工具,今天正好需要为一张保存于SqlServer数据库的千万级数据表增加索引,于是遇到了下面一系列的问题。 我开始想当然的右键需要增加索引的表名----设计----管理索引和建----添加索引----点击保存,一切看来顺其自然的事情,结果等待了几十秒之后,恶心的提示框

小妖鬼鬼 4993

3、固定翼无人机模型解析

本文详细解析了固定翼无人机的动力学模型与纵向模型,涵盖位置、速度、角度及角速度的变化率方程,并介绍了力和力矩的计算方法以及气动系数的表达式。通过关键参数分析,探讨了速度、迎角和倾斜角对飞行性能的影响。文章还展示了模型在编队飞行和任务规划中的应用,并提出了参数优化与先进控制策略等优化思路,为无人机飞行控制系统设计提供了理论基础。

gaochao的博客 240

28_Spring AI 干货笔记之 OpenAI 聊天功能

本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1657

临时表和表变量区别,SQL Server里的视图和临时表在哪里?

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Serv

sun_apple_123 1436

【Unity 反向运动学插件】Final IK 一套完整的IK解决方案

Final IK是Unity中一套完整的反向运动学解决方案,提供多种IK算法(CCD、FABRIK等)和功能模块,包括全身IK、VR驱动、武器瞄准、视线跟随等。其核心是通过数学方法计算关节旋转,使末端骨骼精确到达目标位置。系统支持多约束求解、旋转限制、动画烘焙及交互系统,采用模块化设计,兼顾性能与扩展性,适用于动作游戏、VR等需要高质量角色控制的场景,是Unity生态中最成熟的IK工具链之一。

2403_88403568的博客 1004

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

SQL Server 表变量和临时表的区别 表变量在SQL Server 2000中首次被引入。表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用)。定义表变量的语句是和正常使用Create Table定义表语句的子集。只是表变量通过DECLARE@local_variable语句进行定义。

微风 737

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SQL SERVER 表变量和临时表

一、表变量 1. 表变量定义        表变量,是SQL Server 2000以来引入的概念,表变量本质是一个变量,它具有正式表对象的很多属性。如:它有表字段、字段数据类型、字段宽度、主键、唯一约束、NULL、NOT NULL约束、CHECK和DEFAULT约束。但是,表变量不支持约束命名,不支持索引,不支持外键,不支持表变量定义后的任何表变量结构的修改,仅可做数据的DML操作。 2....

szzhuyike的专栏 3965

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SQL server 临时表和表变量

临时表<br />临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。<br />临时表分为本地和全局两种,本地SQL Server临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局SQL Server临时表的名称都

分享编程和生活的快乐 936

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SQL Server中临时表与表变量的区别

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?   临时表   临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉...

weixin_34357436的博客 257

SQL Server临时表与表变量

本文深入探讨了SQLServer中的临时表与表变量,这两种技术在数据处理中扮演着重要角色。临时表以其快速的数据处理能力和较小的存储空间著称,但需注意其生命周期和范围限制。表变量则适用于存储大量数据,并支持动态调整数据大小。文章还提供了实例演示,展示了如何在实际应用中创建和使用临时表与表变量,并强调了选择合适数据类型和管理生命周期的重要性。通过掌握这些技术,可以更有效地处理SQLServer中的数据,满足不同的业务需求。

2501_90410679的博客 150

php sql server临时表,SQLServer中临时表与表变量的区别分析

在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?临时表临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb...

weixin_39883079的博客 219

SQL Server 表变量与临时表区别

问题 1:为什么在已经有了临时表的情况下还要引入表变量?解答 1:与临时表相比,表变量具有下列优点: • 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量。

浮生若梦 1万+

mySQL表变量和临时表的区别_SQL Server 表变量和临时表的区别

一、表变量表变量在SQL Server 2000中首次被引入。表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用)。定义表变量的语句是和正常使用Create Table定义表语句的子集。只是表变量通过DECLARE @local_variable语句进行定义。表变量的特征:表变量拥有特定作用域...

weixin_31600305的博客 183

SQL Server表变量与临时表对比

在 SQL Server 中处理临时数据时,和是两种核心选择。它们虽然都能临时存储数据,但在实现机制、性能和使用场景上有着显著差异。简单来说,。##

BillKu的博客 354
上一篇: Nhibernate 注意总结
下一篇: C#命名规范,控件、数据类型、ADO.NET等
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值