在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...