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
else
 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(参考:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/exists-transact-sql)

即object_id('Tempdb..#temp')为null,也会执行drop。

 

实践出真知,哈哈

 

转载于:https://www.cnblogs.com/quchen520/p/8684282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值