`
aaron_ch
  • 浏览: 173117 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

SQL Server Temp Table

阅读更多
drop table #Tmp   --删除临时表#Tmp
create table #Tmp --创建临时表#Tmp
(
    ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    WokNo                varchar(50),  
    primary key (ID)      --定义ID为临时表#Tmp的主键     
);
Select * from #Tmp    --查询临时表的数据
truncate table #Tmp --清空临时表的所有数据和约束

相关例子:

Declare @Wokno Varchar(500) --用来记录职工号
Declare @Str NVarchar(4000) --用来存放查询语句
Declare @Count int --求出总记录数     
Declare @i int
Set @i = 0
Select @Count = Count(Distinct(Wokno)) from #Tmp
While @i < @Count
    Begin
       Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
       Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
       Select @WokNo,@i --一行一行把职工号显示出来
       Set @i = @i + 1
    End
临时表
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。

本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。

SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。

除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:

当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。


所有其它本地临时表在当前会话结束时自动除去。


全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。
在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

下面是结果集:

(1 row(s) affected)

Test1Col   
-----------
1         

(1 row(s) affected)

Test2Col   
-----------
2         

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。


临时表的应用
    1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。

2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用。数据处理比较复杂的时候临时表快,反之视图快点。
分享到:
评论

相关推荐

    SQL Server遍历表中记录的2种方法(使用表变量和游标)

    SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。 表变量来实现表的遍历 以下代码中,代码块之间的...

    sqlserver自定义函数

    returns @temp table(F1 varchar(100)) as begin declare @ch as varchar(100) set @SourceSql=@SourceSql+@StrSeprate while(@SourceSql&lt;&gt;'') begin set @ch=left(@SourceSql,charindex(',',@Source...

    SQL Server分隔函数实例详解

    有时候我们在SQL Server中需要对一些字符串进行分隔,比如a... RETURNS @temp TABLE(F1 VARCHAR(100)) AS BEGIN DECLARE @ch AS VARCHAR(100) SET @SourceSql=@SourceSql+@StrSeprate WHILE(@SourceSql&lt;&gt;'') B

    sqlserver存储过程

    drop table Users go create table Users( Id int identity(1,1) not null primary key, --顾客编号,主键 按一进行自动增长 UserName varchar(50)not null, PassWord varchar(50)not null, Address varchar(250)...

    浅析SQL server 临时表

    创建临时表,#代表局部临时表,##代表全局临时表。局部临时表和全局临时表...修改Sql 语句中的#tempTable 为 ##tempTable, 依照上述方法再次执行,会发现新建查询2中不再提示错误,能查出和新建查询1中同样的结果。Wh

    SqlServer 序号列的实现方法

    对于 SQL SERVER 2000 及更早的版本,需要使用一个自增列,结合临时表来实现。 代码如下:SELECT [AUTOID] = IDENTITY(int,1,1), * INTO #temp_table FROM 表名; 代码如下:SELECT * FROM #temp_table; 从 SQL SERVER ...

    SQL SERVER中关于exists 和 in的简单分析

    如图,现在有两个数据集,左边表示#tempTable1,右边表示#tempTable2。现在有以下问题: 1.求两个集的交集? 2.求tempTable1中不属于集#tempTable2的集? 先创建两张临时表: create table #tempTable1 ( argument...

    sqlserver中如何查询出连续日期记录的代码

    代码如下: –创建一个临时表,将会存储连续日期的记录 CREATE TABLE #temp (IDD VARCHAR(10),SDATE DATETIME) DECLARE @sD DATETIME –开始日期 DECLARE @eD DATETIME –结束日期 –在记录中,找出开始与结束日期 ...

    Mysql,SQL Server 2000,Oracle四种数据库的连接

    Connection con=java.sql.DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=books","sa",""); Statement stmt=con.createStatement(); ResultSet rst=stmt.executeQuery(...

    SQL Server分隔函数

    有时候我们在SQL Server中需要对一些字符串进行分隔,比如a,b,c ,按照‘,’进行... RETURNS @temp TABLE(F1 VARCHAR(100)) AS BEGIN DECLARE @ch AS VARCHAR(100) SET @SourceSql=@SourceSql+@StrSeprate WHIL

    标识列与普通列相互转换示例

    标识列与普通列相互转的示例 ...ALTER TABLE t1 ADD ID_temp int GO UPDATE t1 SET ID_temp=ID ALTER TABLE t1 DROP COLUMN ID EXEC sp_rename N't1.ID_temp',N'ID',N'COLUMN' INSERT t1 VALUES(100,9) GO --.........

    SQL Server中选出指定范围行的SQL语句代码

     按照通常的方法是实现不了的,我们得借助于临时表以及一个函数来实现 代码如下: Select no=Identity(int,1,1),* Into #temptable From dbo.teacher_info order by teacher_name–利用Identity函数生成...

    sql中循环处理当前行数据和上一行数据相加减

    以下事例,使用游标循环表#temptable中数据,然后让当前行和上一行中的argument1 相加 存放到当前行的 argument2 中,比较简单。 --drop table #temptable create table #temptable ( argument1 int, argument2 ...

    sqlserver FOR XML PATH 语句的应用

    insert into @TempTable (UserID,UserName) values (1,’a’) insert into @TempTable (UserID,UserName) values (2,’b’) select UserID,UserName from @TempTable FOR XML PATH 运行这段脚本,将生成如下结果: ...

    SQL Server使用row_number分页的实现方法

    本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下 1、首先是 select ROW_NUMBER() over(order by id asc) as ‘rowNumber’, * from table1 生成带序号的集合 2、再查询该集合的 ...

    sql server 临时表 查找并删除的实现代码

    if exists(select * from tempdb..sysobjects where id=object_id(‘tempdb..#temp’)) drop table #temp临时表 可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。 本地临时...

    经典SQL语句大全

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    excel导入sql2005的几种方法归纳

    [SQL]将Excel表数据导入SQL Server2005的几种方法归纳 数据库 2010-07-27 11:14:26 阅读201 评论0 字号:大中小 订阅 近日在巨轮着手车间负荷数据处理,反馈回来的数据是保存在Excel文件中的,我必须将其导入SQL ...

    导出创建用户下各个对象数据结构的sql语句的脚本,包括表、视图、索引、约束等等

    \user_ddl_sql.sql c:\temp\ &lt;br/&gt;说明: 运行win_mkdir.bat,文件后,会自动在生成脚本的基本目录下产生如下目录: procedures, functions, triggers, packages, temp_sql. 每个目录的作用...

Global site tag (gtag.js) - Google Analytics