首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 判斷資料表、臨時表、檢視表、預存程序是否存在的標準方法

     編輯:關於SqlServer

核心函數:OBJECT_ID()

OBJECT_ID('name' [, 'type']) 回傳物件識別碼,不存在則回傳 NULL。type 參數可縮小搜尋範圍,提升效能並避免同名不同類型物件誤判。

常用類型代碼

代碼說明適用物件
UUSER_TABLE使用者資料表
VVIEW檢視表
PSQL_STORED_PROCEDURE預存程序
FNSQL_SCALAR_FUNCTION純量函數
IFSQL_INLINE_TABLE_VALUED_FUNCTION內嵌表值函數
TFSQL_TABLE_VALUED_FUNCTION多陳述式表值函數
TRSQL_TRIGGER觸發器
PKPRIMARY_KEY_CONSTRAINT主鍵約束
FFOREIGN_KEY_CONSTRAINT外鍵約束
DDEFAULT_CONSTRAINT預設約束
CCHECK_CONSTRAINT檢查約束

完整清單:SELECT DISTINCT type, type_desc FROM sys.objects;

標準判斷範本

1. 使用者資料表

IF OBJECT_ID(N'dbo.MyTable', N'U') IS NOT NULL
    PRINT N'存在';
ELSE
    PRINT N'不存在';

2. 區域臨時表 (#Table)

IF OBJECT_ID(N'tempdb..#MyTemp', N'U') IS NOT NULL
    PRINT N'存在';

注意:必須指定 tempdb.. 前綴,否則搜尋目前資料庫找不到。

3. 全域臨時表 (##Table)

IF OBJECT_ID(N'tempdb..##MyGlobalTemp', N'U') IS NOT NULL
    PRINT N'存在';

4. 檢視表

IF OBJECT_ID(N'dbo.MyView', N'V') IS NOT NULL
    DROP VIEW dbo.MyView;

5. 預存程序

IF OBJECT_ID(N'dbo.MyProc', N'P') IS NOT NULL
    DROP PROCEDURE dbo.MyProc;

6. 函數 (涵蓋 FN/IF/TF)

IF OBJECT_ID(N'dbo.MyFunc', N'FN') IS NOT NULL
    OR OBJECT_ID(N'dbo.MyFunc', N'IF') IS NOT NULL
    OR OBJECT_ID(N'dbo.MyFunc', N'TF') IS NOT NULL
    DROP FUNCTION dbo.MyFunc;

或簡寫:IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.MyFunc') AND type IN (N'FN',N'IF',N'TF'))

7. 欄位是否存在

IF COL_LENGTH(N'dbo.MyTable', N'MyColumn') IS NOT NULL
    PRINT N'欄位存在';

8. 資料庫是否存在

IF EXISTS (SELECT 1 FROM sys.databases WHERE name = N'MyDB')
    PRINT N'資料庫存在';

進階:批次清理腳本範例

-- 安全移除資料表 (含約束)
IF OBJECT_ID(N'dbo.OrderDetail', N'U') IS NOT NULL BEGIN
    DECLARE @sql NVARCHAR(MAX) = N'';
    SELECT @sql += N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + N'.' + QUOTENAME(OBJECT_NAME(parent_object_id)) 
                   + N' DROP CONSTRAINT ' + QUOTENAME(name) + N'; '
    FROM sys.objects WHERE type = 'F' AND referenced_object_id = OBJECT_ID(N'dbo.OrderDetail');
    EXEC sp_executesql @sql;
    DROP TABLE dbo.OrderDetail;
END

舊版相容寫法 (sysobjects/syscolumns) — 僅供維護舊代碼參考

-- 不建議新代碼使用
IF EXISTS (SELECT 1 FROM dbo.sysobjects WHERE id = OBJECT_ID(N'dbo.MyTable') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
    PRINT N'存在';

最佳實務建議

  1. 統一使用 OBJECT_ID() + 兩部分名稱 Schema.Object + 明確 type 參數。
  2. 臨時表務必加 tempdb.. 前綴。
  3. 建立/移除物件前先判斷存在性,避免腳本重複執行報錯。
  4. 欄位檢查用 COL_LENGTH(),比查詢 INFORMATION_SCHEMA.COLUMNS 更輕量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved