SQL Server 临时表用法 object_id sysobjects tempdb dbo #temp

临时表存储在tempdb中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。

临时表有如下几个特点:

  1. 本地临时表就是用户在创建表的时候添加了"#"前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权,其它连接不能访问该表。
  2. 不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQL Server中,通过特别的命名机制保证本地临时表在数据库上的独立性。
  3. 真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
    (补充:一次磁盘的连续读或者连续写称为一次磁盘 I/O)
  4. 临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
  • 本地临时表
    本地临时表的名称以单个数字符号(#)打头;它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从SQL Server实例断开连接时被删除。

更多请转至此篇查看。临时表的使用,这篇文章介绍得比较全面。上述也是转载自这篇文章:sql临时表的使用详解


在开发过程中,很多时候要把结果集存放到临时表中,常用的方法如下:
转载自:sqlserver临时表用法

SELECT INTO

  1. 使用select into会自动生成临时表,不需要事先创建
select * into #temp from sysobjects select * from #temp
  1. 如果当前会话中,已存在同名的临时表
select * into #temp from sysobjects

再次运行,则会报错提示:数据库中已存在名为 ‘%1!’ 的对象。

Msg 2714, Level 16, State 6, Line 2
There is already an object named '#temp' in the database.

在使用select into前,可以先做一下判断:

if OBJECT_ID('tempdb..#temp') is not null drop table #temp
select * into #temp from sysobjects
select * from #temp

  1. 利用select into生成一个空表
    如果要生成一个空的表结构,不包含任何数据,可以给定一个恒不等式如下:
select * into #temp from sysobjects where 1=2 select * from #temp

其实我是遇到问题才想要解决问题。
最近公司的小姐姐让我用自己的逻辑去写两个公司的表(已经有了,主要是想教我动手自己写SQL脚本)。

它的一部分是这样的:
SQL Server 临时表用法 object_id sysobjects tempdb dbo #temp_第1张图片
经过查阅大佬们的资料,知道:

  • object_id就是根据对象名称返回该对象的id

select object_id(对象名)等同于:

select id from sysobjects where name = 对象名
  • object_name就是根据对象id返回对象名称

select object_name(id号)等同于:

select name from sysobjects where id = id号
其中

语法:object_id(‘objectname’)或object(‘objectname’,‘type’)
作用:该函数会返回指定对象的id值,可以在sysobjects表中进行验证。

  • sysobjects
    SQL Server的每个数据库内都有此系统表,它存放该数据库内创建的所有对象。其中每个对象在表中占一行。可以在sysobjects中查询下看结果,可以看出每个对象都有一个唯一的id值。sysobjects表中存储了表,存储过程,触发器,视图等相关信息。(注意:没有字段)

补充:

sysobjects中最有用的两列:

  1. sysobjects.name:用来列出待考察对象的名字
  2. sysobjects.xtype:用来定义对象的类型
select * from sys.objects--在数据库中创建的每个用户定义的架构范围内的对象在该表中均对应一行
select * from sys.sysobjects--在数据库中创建的每个对象(例如约束、默认值、日志、规则以及存储过程)都对应一行

这儿的objects是sysobjects的子集。

注意

如果指定一个临时表,则必须在临时表名前面加上数据库名。
如:select object_id ('tempdb..#mytemptable')


  • tempdb是临时数据库
    tempdb 系统数据库用来存储临时对象,作为临时的数据存储区,是一个全局资源,可供连接到 SQL Server 实例的所有用户使用。
    重启服务之后,没有东西会存储在tempdb中,因为每次重启都会重建。隐含意思是不可以对这个库进行备份还原。

  • dbo(database owner):即数据库所有者
    是每个数据库的默认用户,具有所有者权限。若以dbo作为所有者来定义对象,能使数据库中的任何用户引用而不必提供所有者名称。

  • #temp是本地临时表(具体请参考接文章开头

总结

这段SQL脚本(上图中)的意思就是:如果临时数据库里已存在同名的临时表,那就删掉它,再重建一个拥有如下字段xx,xx,xx,……的临时表,这些字段来自于入库时间在2020-03-02 00:00:00后的dbo.xx表。

你可能感兴趣的:(SQL,sql,sqlserver)