的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()
的問題似乎並沒有被要求OBJECT_ID是什麼,但它爲什麼即使在這種情況下使用的。有趣的問題,因爲這似乎也會工作以及...'如果不存在(SELECT * FROM sysobjects WHERE name ='YourTable')...' –
在sys.objects模式是一個數字FK指向模式的系統視圖 - OBJECT_ID()函數將解析字符串並獲取正確的objectID(每個對象在sql server中都有唯一的id),並且可以將該模式名稱包含在傳遞給OBJECT_ID()的字符串中。恕我直言 - 更具說明性的方法是使用ISO視圖INFORMATION_SCHEMA.TABLES(我給出並回答) –
'IF OBJECT_ID(N'[dbo]。[YourTable]','U')IS NOT NULL '就夠了。針對'sys.objects'的查詢是多餘的。 –