SQLServer中表的删除重建语句今天遇到表的删除重建问题,稍微测试了⼀下。具体内容如下:
1.常规表的重建
if exists(select * from sys.objects where name='tmp' and type='U')
drop table tmp
else
create table tmp
(
id int,
name varchar(20)
)
type='U'通常是⽤来防⽌,起名时和系统的对象同名。如果可以保证没有,可以不带。
2.临时表的重建
临时表和普通表是不同的,它们存放在tempdb中,所以在sys.objects中是查不到的。
所以下⾯的例⼦不能得到正确的结果,因为drop语句不会运⾏,exists的条件不会为true。
IF  EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='#temp')
DROP TABLE #temp
GO
SELECT *
INTO #temp
FROM [dbo].[Table_1]
GO
正确的写法如下:
if (object_id('tempdb..#tmp') is not null)
drop table #tmp
drop table if exists userelse
 create table #tmp(id int,name varchar(20))
看到⽹上有下⾯的写法,这种写法在语法检查的时候是对的。但是实际是存在错误的。
if exists (select object_id('Tempdb..#temp') )
DROP TABLE #temp
go
上⾯的语句在#temp已经创建的情况下是可以正确运⾏的,但是当#temp不存在或者已经被drop掉了,则会报错。
因为exists的定义是Returns TRUE if a subquery contains any rows,并且Using NULL in a subquery to still return a result set(参考:docs.microsoft/en-us/sql/t-sql/language-elements/exists-transact-sql)
即object_id('Tempdb..#temp')为null,也会执⾏drop。
实践出真知,哈哈