此文章主要向大家讲述的是利用SQL Server临时表与利用SQL Server表变量的一些区别,假如你对其这两者的实际操作有兴趣了解的话,你就可以通过以下的文章对利用SQL Server临时表与利用SQL Server表变量有更好的了解。
- CREATE TABLE dbo.#News ( News_id int NOT NULL, NewsTitle varchar(100), NewsContent varchar(2000),
- NewsDateTime datetime ) INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
- VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) SELECT News_id, NewsTitle,
- NewsContent, NewsDateTime FROM dbo.#News DROP TABLE dbo.[#News]
利用表变量
- DECLARE @News table ( News_id int NOT NULL, NewsTitle varchar(100),
- NewsContent varchar(2000), NewsDateTime datetime ) INSERT INTO @News
- (News_id, NewsTitle, NewsContent, NewsDateTime) VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
- SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News
我们可以看到上面两种情况实现的是一样的效果,***种利用SQL Server临时表的时候,临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建,而定义表变量也不需要进行DROP Table的操作,一次执行完成后就会消失。
其实在选择临时表还是表变量的时候,我们大多数情况下在使用的时候都是可以的,但一般我们需要遵循下面这个情况,选择对应的方式:
1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。
2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用SQL Server临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。
注:表变量虽然不支持索引,但是表变量支持主键阿,所以可以利用主键来替代索引。
注:由于表变量不支持统计数据,因此在一个存储过程中使用表变量可以减少由于数据变化而导致的重新编译问题。
注:表变量同时也不支持并行执行计划,因此对于大型的临时结果集,表变量也不是一个好的选择
对于函数中不能支持SQL Server临时表是由于函数不能对函数作用域外部的资源状态造成***性的更改,在SQLServer中也称为副作用(sideeffect)。不过如果在函数中使用大型的临时结果集是不推荐的,因为如果将这样的函数放置到一个查询中会造成很明显的性能问题,因此这种情况一般都采用存储过程之类的批处理脚本。
对于动态脚本不支持表变量的原因是因为存储过程不接受表类型的参数。不过如果表变量的声明和赋值都在sp_executesql的参数中的话,sp_executesql就可以执行了,因为这个时候表变量就存在sp_executesql的stmt参数里面,不需要传入,例如下面的代码:(当然这样的实用性也就没有多少了)
- DECLARE @m nvarchar(max) SET @m = N"DECLARE @t TABLE (ID int);INSERT INTO @tVALUES(1);SELECT * FROM @t T" EXEC sp_executesql @m
以上的相关内容就是对利用SQL Server临时表与利用表变量比较,望你能有所收获。
【编辑推荐】
- 用SQL Server 2005DDL触发器对数据库进行监控
- MS SQL Server 未公开的加密函数有哪些?
- SQL Server存储图像数据大阅兵
- SQL Server复制和其相关的工作原理
- SQL Server游标实例演示,不得不看!