Sqlserver中判斷表是否存在

2021-06-20 13:46:11 字數 3895 閱讀 2322

在sqlserver(應該說在目前所有資料庫產品)中建立乙個資源如表,檢視,儲存過程中都要判斷與建立的資源是否已經存在 

在sqlserver中一般可通過查詢sys.objects系統表來得知結果,不過可以有更方便的方法 

如下: 

if   object_id('tb_table') is not null  

print 'exist' 

else 

print'not exist' 

如上,可用object_id()來快速達到相同的目的,tb_table就是我將要建立的資源的名稱,所以要先判斷當前資料庫中不存在相同的資源 

object_id()可接受兩個引數,第乙個如上所示,代表資源的名稱,上面的就是表的名字,但往往我們要說明我們所要建立的是什麼型別的資源, 

這樣sql可以明確地在一種型別的資源中查詢是否有重複的名字,如下: 

if   object_id('tb_table','u') is not null  

print 'exist' 

else 

print'not exist' 

第二個引數 "u" 就表示tb_table是使用者建立的表,即:user_table地首字母簡寫 

查詢sys.objects中可得到各種資源的型別名稱(type列),這裡之舉幾個主要的例子 

u  -----------  使用者建立的表,區別於系統表(user_table) 

s  -----------  系統表(system_table) 

v  -----------  檢視(view) 

p  -----------  儲存過程(sql_stored_procedure) 

可使用select distinct type ,type_desc from sys.objects 獲得全部資訊

庫是否存在 

if exists(select * from master..sysdatabases where name=n'庫名') 

print 'exists'

else

print 'not exists'

--------------- 

-- 判斷要建立的表名是否存在 

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[表名]') and objectproperty(id, n'isusertable') = 1) 

-- 刪除表 

drop table [dbo].[表名] 

go --------------- 

-----列是否存在 

if col_length( '表名','列名') is null

print 'not exists'

else

print 'exists'

alter table 表名 drop constraint 預設值名稱 

go alter table 表名 drop column 列名 

go ----- 

--判斷要建立臨時表是否存在 

if object_id('tempdb.dbo.#test') is not null

begin

print '存在'

endelse

begin

print '不存在'

end--------------- 

-- 判斷要建立的儲存過程名是否存在 

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[儲存過程名]') and objectproperty(id, n'isprocedure') = 1) 

-- 刪除儲存過程 

drop procedure [dbo].[儲存過程名] 

go --------------- 

-- 判斷要建立的檢視名是否存在 

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[檢視名]') and objectproperty(id, n'isview') = 1) 

-- 刪除檢視 

drop view [dbo].[檢視名] 

go --------------- 

-- 判斷要建立的函式名是否存在 

if exists (select * from sysobjects where xtype='fn' and name='函式名') 

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[函式名]') and xtype in (n'fn', n'if', n'tf')) 

-- 刪除函式 

drop function [dbo].[函式名] 

go if col_length('表名', '列名') is null

print '不存在'

select 1 from sysobjects where id in (select id from syscolumns where name='列名') and name='表名'

ps:sysobjects

在資料庫內建立的每個物件(約束、預設值、日誌、規則、儲存過程等)在表中佔一行。只有在 tempdb 內,每個臨時物件才在該表中佔一行。

列名 資料型別 描述 

name sysname 物件名。 

id int 物件標識號。 

xtype char(2) 物件型別。可以是下列物件型別中的一種: 

c = check 約束

d = 預設值或 default 約束

f = foreign key 約束

l = 日誌

fn = 標量函式

if = 內嵌表函式

p = 儲存過程

pk = primary key 約束(型別是 k)

rf = 複製篩選儲存過程

s = 系統表

tf = 表函式

tr = 觸發器

u = 使用者表

uq = unique 約束(型別是 k)

v = 檢視

x = 擴充套件儲存過程

uid smallint 所有者物件的使用者 id。 

info smallint 保留。僅限內部使用。 

status int 保留。僅限內部使用。 

base_schema_

ver int 保留。僅限內部使用。 

replinfo int 保留。供複製使用。 

parent_obj int 父物件的物件標識號(例如,對於觸發器或約束,該標識號為表 id)。 

crdate datetime 物件的建立日期。 

ftcatid smallint 為全文索引註冊的所有使用者表的全文目錄識別符號,對於沒有註冊的所有使用者表則為 0。  

schema_ver int 版本號,該版本號在每次表的架構更改時都增加。 

stats_schema_

ver int 保留。僅限內部使用。 

type char(2) 物件型別。可以是下列值之一: 

c = check 約束 

d = 預設值或 default 約束

f = foreign key 約束 

fn = 標量函式

if = 內嵌表函式

k = primary key 或 unique 約束 

l = 日誌

p = 儲存過程

r = 規則

rf = 複製篩選儲存過程

s = 系統表 

tf = 表函式

tr = 觸發器

u = 使用者表

v = 檢視

x = 擴充套件儲存過程

SQL Server 中如何判斷表是否存在

sql server資料庫中表等物件都儲存在sysobjects資料表中,臨時表被儲存於tempdb資料庫中 1.判斷普通表是否存在,可以使用object id函式,它可以根據物件名稱返回物件的id if select object id tablename is notnull select tr...

sqlserver判斷表是否存在

1 判斷資料表是否存在 方法一 use yourdb goif object id n tablename n u is not null print 存在 else print 不存在 例如 use fireweb goif object id n temp tbl n u is not null...

SQL Server 判斷表是否存在

1 判斷資料表是否存在 方法一 use yourdb goif object id n tablename n u is not null print 存在 else print 不存在 例如 use fireweb goif object id n temp tbl n u is not null...