Asp教程

通过asp实例结合结合ACCESS,MSSQL来更好的深入Asp学习 - 爬坡者

« 带#的临时表和带@的表有什么区别解析SQL语句在何种情况下进行全表扫描 »

临时表 和 表变量

临时表 和 表变量
我们经常使用临时表和表变量,那现在我们就对临时表和表变量进行一下讨论.

临时表

局部临时表

全局临时表

表变量

临时表

临时表存储在TempDB数据库中,所有的使用此SQL Server 实例的用户都共享这个TempDB,因为我们应该确保用来存储TempDB数据库的硬盘有足够的空间,以使之能够自己的增长.最好能够存储在一个拥有独立硬盘控制器上.因为这样不存在和其它的硬盘I/O进行争用.



我们很多程序员认为临时表非常危险,因为临时表有可能被多个连接所共享.其实在SQL Server中存在两种临时表:局部临时表和全局临时表,局部临时表(Local temp table)以#前缀来标识,并且只能被创建它的连接所使用.全局临时表(Global temp table)以##前缀来进行标识,并且可以和其它连接所共享.

局部临时表

局部临时表不能够被其它连接所共享的原因其实是在SQL Server 2000中自动为局部临时表的表名后面加上了一个唯一字符来标识.如:

alter proc WorkInfo
 
as
 begin transaction 
  
  if exists(select * from TestTable1 where Stu_Status = 0) --检索表1中新增数据,默认新增状态为0
   begin 
    select * into #temp from TestTable1 where Stu_Status = 0 --将新增数据写如一临时表中

    --select * from #temp --查看临时表数据

    insert into pubs.dbo.TestTable2 select Stu_Name,Stu_Sex,Stu_Age,Stu_Status from #temp --将临时表数据写如表2中
  
    --select * from pubs.dbo.TestTable2 --查看表2数据 

    update TestTable1 set Stu_Status = 1 where Stu_ID in (select Stu_ID from #temp)--更新表1中数据status=1
  
    --select * from TestTable1--查看表1数据

    --update TestTable1 set Stu_Status = 0 where Stu_ID in (select Stu_ID from TestTable1)--将表1数据更改为初始值status=0
  
    drop table #temp  --删除临时表
   end
  else
   select * from pubs.dbo.TestTable2 

 commit transaction
  return 1
 rollback transaction
  return 2

GO

                           CREATE TABLE [#DimCustomer_test]

                           (

                              [CustomerKey] [int]

                              ,   [FirstName] [nvarchar](50)  

                          ,[MiddleName] [nvarchar](50)  

                          ,[LastName] [nvarchar](50) 

                              )


现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表#DimCustomer_test已经被加上了后缀:



                              USE TempDB

                              GO

                              SELECT name FROM sysobjects WHERE name LIKE '%DimCustomer%'




the Result is:

name

#DimCustomer_test____________________________________________________________________000000000005

全局临时表

下面我们来看一下全局临时表:

                              CREATE TABLE [##DimCustomer_test]

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50)  

                             ,[MiddleName] [nvarchar](50)  

                             ,[LastName] [nvarchar](50) 

                                 )


现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表##DimCustomer_test没有被加上了后缀:



                              USE TempDB

                              GO

                              SELECT name FROM sysobjects WHERE name LIKE '%DimCustomer%'

 

The Result are:

#DimCustomer_test____________________________________________________________000000000005

##DimCustomer_test

 

--Drop test temp tables

                              DROP TABLE [##DimCustomer_test]

                              DROP TABLE [#DimCustomer_test]




可以看到我们刚才创建的全局临时表名字并没有被加上标识.



表变量

表变量和临时表针对我们使用人员来说并没有什么不同,但是在存储方面来说,他们是不同的,表变量存储在内存中.所以在性能上和临时表相比会更好些!



另一个不同的地方是在表连接中使用表变量时,要为此表变量指定别名.如:



                              USE AdventureWorksDW

                              GO

 

                              DECLARE @DimCustomer_test TABLE 

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50)  

                             ,[MiddleName] [nvarchar](50)  

                             ,[LastName] [nvarchar](50) 

                                 )

                              ---insert data to @DimCustomer_test

                              INSERT @DimCustomer_test 

                              (

                                 [CustomerKey]  

                                 ,      [FirstName]  

                             ,[MiddleName]  

                             ,[LastName] 

                                 )

                              SELECT  

                                 [CustomerKey]  

                                 ,      [FirstName]  

                             ,[MiddleName]  

                             ,[LastName] 

                              FROM DimCustomer

 

                              SELECT [@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)

                              FROM @DimCustomer_test  INNER JOIN FactInternetSales   ON

                              @DimCustomer_test.CustomerKey = FactInternetSales.CustomerKey

                              Group BY CustomerKey

 

Result:

 

Server: Msg 137, Level 15, State 2, Line 32

Must declare the variable '@DimCustomer_test'.






如果我们对上面的查询进行更改,对查询使用别名(并且找开IO):

-----in the follow script,we used the table alias.



                              DECLARE @DimCustomer_test TABLE 

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50)  

                             ,[MiddleName] [nvarchar](50)  

                             ,[LastName] [nvarchar](50) 

                                 )

 

                              INSERT @DimCustomer_test 

                              (

                                 [CustomerKey]  

                                 ,      [FirstName]  

                             ,[MiddleName]  

                             ,[LastName] 

                                 )

                              SELECT  

                                 [CustomerKey]  

                                 ,      [FirstName]  

                             ,[MiddleName]  

                             ,[LastName] 

                              FROM DimCustomer

 

                              SELECT t.CustomerKey,f.OrderQuantity

                              FROM @DimCustomer_test t INNER JOIN FactInternetSales  f ON

                              t.CustomerKey = f.CustomerKey

                              where t.CustomerKey=13513




表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表表一样显示的对它进行删除.



但是在存储过程中不能够使用表变量,而只能够使用临时表.

发表于 2005年9月13日 22:17

评论

# re: 临时表 和 表变量 
上面环境是基于SQL Server 2000,SQL Server 2005在这方面做了一些更改。这个可以参照luke的blog 
2005-9-14 12:54 | 董晓涛 
# re: 临时表 和 表变量 
“但是在存储过程中不能够使用表变量,而只能够使用临时表.”???? 
误导群众 
2005-9-29 11:35 | xxx 
# re: 临时表 和 表变量 
表变更一样可以用在存储过程中 
2006-5-16 15:15 | zengdj 
# re: 临时表 和 表变量 
他的意思是不是不能用 
insert into @table exec sp 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2007-2008 papozhe.com [asp教程] All Rights Reserved.
浙ICP备07030537号
免责申明:所有文章除特别声明,均来自网上,主要为学习用!内容仅供参考,版权归原作者。如侵犯您利益,请来信告知.
Email:papozhe$Gmail.com QQ:76336503