sql中如何创建临时表,创建临时表sql语句
内容导航:
一、sql如何创建临时表
网上其实很多相关文章,你可以搜一下,并不一定需要在这里提问。转帖一篇给你吧drop table #Tmp –删除临时表#Tmpcreate 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 intSet @i = 0 Select @Count = Count(Distinct(Wokno)) from #TmpWhile
@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 Test2ASCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES
(2)SELECT Test2Col = x FROM #tGOCREATE PROCEDURE Test1ASCREATE TABLE #t(x INT
PRIMARY KEY)INSERT INTO #t VALUES (1)SELECT Test1Col = x FROM #tEXEC
Test2GOCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (99)GOEXEC
Test1GO下面是结果集:(1 row(s) affected)Test1Col ———– 1 (1 row(s)
affected)Test2Col ———– 2 当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY
约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN
KEY 约束。在 FOREIGN KEY
约束中不能引用临时表。考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。
二、SQL数据库中临时表临时变量和with as关键词创建“临时表”的区别
SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后在针对这个数据进行操作。
创建“临时表”(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种: tempTableName as方法(05之后出现):with temptable
as 其实并没有建立临时表,只是子查询部分(subquery factoring),定义一个SQL片断,该SQL片断会被整个SQL语句所用到。
有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL比较有用。
因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。
.html
三、SQL怎么创建一个临时表
创建临时表
方法一:
create table #临时表名(字段1 约束条件,
字段2 约束条件,
…..)
create table ##临时表名(字段1 约束条件,
字段2 约束条件,
…..)
方法二:
select * into #临时表名 from 你的表;
select * into ##临时表名 from 你的表;
注:以上的#代表局部临时表,##代表全局临时表
查询临时表
select * from #临时表名;
select * from ##临时表名;
删除临时表
drop table #临时表名;
drop table ##临时表名;
四、SQL中系统临时表的使用和禁忌有哪些
答:以前在SQL中写SP时,如比较复杂时,喜欢中间使用临时表来暂存相关记录,这样的好处有很多,提高效率,提高程序的可读性等。当然后临时表的使用,一般均会使用用户临时表,即#TempTable,但有一些情况下,偶尔也会使用系统临时表,即##TempTable。两种临时表的的使用语法差不多,可用几种方法来建立,可Create,也可SelectInto。当然关键的是系统临时表和用户临时表的区别:(如下)1)用户临时表:用户临时表的名称以单个数字符号(#)开头;用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.当创建它的进程消失时这个临时表就自动删除.2)系统临时表:系统临时表的名称以数字符号(##)开头全局临时表对整个SQLServer实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.明白了这些就知道了他们的用途和限制,但有一些地方还是容易出问题,故在此专门列出。1,在使用Exec(SQLScript)执行Script时,其间也相当于单独有一个进程处理,故执行期间内如果创建用户临时表的话,在执行完成后也就结束了,即执行完成后,你不可以使用在SQLScript中生成的用户临时表,可以用系统临时表代替。2,在使用用户临时表时,有一个问题要注意,就是最好在建立时指定其用户为dbo,以避免可能的问题;3,在使用系统临时表时,一定要考虑到,不可以将其用于多用户使用的环境功能或系统中,否则就可能出现冲突的问题,导致结果不可预料。如果在多用户使用的环境中使用系统临时表,则可能会出现多个用户同时对同一系统临时表进行处理,从而导致冲突和数据的错误。以前没有注意这一点,我就因此而浪费过不少的时间。有时需要使用Exec(SQLScript)方式产生数据,但其中只能使用系统临时表,如何处理呢?1,考试大提示可以预先定义好一个用户临时表,然后使用Insert#TempTableExec(SQLScript)的方式,即可将Exec产生的结果记录加入用户临时表,从而避免使用系统临时表;2,从根本上避免使用Exec(),可用其它方式代替。Exec()的使用是因为有一些Script比较复杂,其中需要一些组合字符,如in(‘‘,‘‘,‘‘)或其它可能的情况,在此情况,无法直接使用一般的Script产生记录,只能先产生一个组合的Script,然后用Exec执行。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/128619.html