2013-07-09 23 views
25

我需要檢查sql中是否存在表。爲什麼在檢查表是否存在時使用OBJECT_ID

如果不是,它必須自動創建一個。

現在我研究後發現這種編碼:

IF NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U')) 

BEGIN 
CREATE TABLE [dbo].[YourTable](
.... 
.... 
.... 
) 

END 

任何人都可以解釋爲什麼它說在那裏object_id = OBJECT_ID,我應該放在它的位置?

+2

的問題似乎並沒有被要求OBJECT_ID是什麼,但它爲什麼即使在這種情況下使用的。有趣的問題,因爲這似乎也會工作以及...'如果不存在(SELECT * FROM sysobjects WHERE name ='YourTable')...' –

+1

在sys.objects模式是一個數字FK指向模式的系統視圖 - OBJECT_ID()函數將解析字符串並獲取正確的objectID(每個對象在sql server中都有唯一的id),並且可以將該模式名稱包含在傳遞給OBJECT_ID()的字符串中。恕我直言 - 更具說明性的方法是使用ISO視圖INFORMATION_SCHEMA.TABLES(我給出並回答) –

+5

'IF OBJECT_ID(N'[dbo]。[YourTable]','U')IS NOT NULL '就夠了。針對'sys.objects'的查詢是多餘的。 –

回答

0
object_id = OBJECT_ID(N'[dbo].[YourTable]') 

object_idsys.objects

OBJECT_ID列名是返回ID您指定的目標函數,即YourTable

您正在比較YourTable的object_id與sys.objects表中的object_id列。您需要用您要檢查的表名替換YourTable已存在。

+0

所以我必須這樣離開: – user2564223

+1

@ user2564223 - 只需用'[dbo]替換'[dbo]。[YourTable]'即可。[THETABLEYOUNEEDTOCHECKEXISTSORNOT]' –

+0

WHERE object_id = OBJECT_ID(N'[dbo]。[Pastel_Companies]')AND輸入(N'U')) – user2564223

1

OBJECT_ID()是返回對象ID的函數。請參閱文檔:

返回模式範圍爲 對象的數據庫對象標識號。

http://msdn.microsoft.com/en-us/library/ms190328.aspx


通過它傳遞一些參數(即你的表的詳細信息),它會返回一個ID。然後,您可以將其與sys.objects表中的ID進行比較,以檢查它是否當前存在。

6

的ISO SQL的方法來檢查表級別對象的存在是INFORMATION_SCHEMA.TABLES查看

沒有什麼錯與望着sys.objects中,但.... INFORMATION_SCHEMA.TABLES是更具聲明一點 - 和它的跨平臺(這往往不會在所有問題,但仍MEH不錯。)

我想這可能是一個新的編碼器雖然更具可讀性:

DECLARE @tableName SYSNAME = 'tbfoo' 
DECLARE @schemaNAme SYSNAME = 'fooSchema' 

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName) 
BEGIN 
    RAISERROR('%s exists in schema: %s', 0, 1, @tableName, @schemaName) 
END 
ELSE 
BEGIN 
    RAISERROR('%s DOES NOT EXIST in schema: %s', 0, 1, @tableName, @schemaName) 
END 

不要擔心關於RAISERROR命令 - 它只是一個打印格式化消息的好方法。

您可以查詢INFORMATION_SCHEMA視圖以瞭解其中的內容。

SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES 

正如你所看到的 - 你可以通過名稱引用模式和目錄,而不是看他們的ID與OBJECT_ID()

58

我喜歡這種語法:

if(object_id(N'[dbo].[YourTable]', 'U') is not null) 
... 

在哪裏發生的object_id 2 char類型的對象作爲第二個參數。你可以找到在sys.objects documentation下面列出的對象類型的列表:

  • AF =聚合函數(CLR)
  • C = CHECK約束
  • d = DEFAULT(約束或獨立)
  • F =外鍵約束
  • FN = SQL標量函數
  • FS =彙編(CLR)標量函數
  • FT =彙編(CLR)表值功能
  • IF = SQL聯表值函數
  • IT =內部表
  • P = SQL存儲過程
  • PC =彙編(CLR)存儲過程
  • PG =計劃引導
  • PK = PRIMARY KEY約束
  • R =規則(舊式,單機)
  • RF =複製濾波器-過程
  • S =系統BA SE表
  • SN =同義詞
  • SO = Sequence對象
  • SQ =服務隊列
  • TA =彙編(CLR)DML觸發器
  • TF = SQL表值函數
  • TR = SQL DML觸發
  • TT =表型
  • U =表(用戶定義的)
  • UQ = UNIQUE約束
  • V =查看
  • X =擴展存儲過程