2012-02-26 125 views
2

我用這個命令在SQL服務器2008DROP TABLE兩種模式

IF EXISTS(SELECT name FROM [DBName]..sysobjects WHERE name = N'TableName' AND xtype='U') 
DROP TABLE [DBName].[SchemaName].[TableName]; 

刪除表,但現在我有2代表在不同的模式相同的名稱:

[DBName].[Schema1].[Members] 

而且

[DBName].[Schema2].[Members] 

所以,如果存在這樣的表什麼是你做檢查的建議?我如何使用模式檢查表名?

UPDATE:

OK,有3個不同的答案,他們都工作過,所以我不知道哪一個是更好的,沒有任何一個知道使用object_idsys.tables

回答

1
IF EXISTS(
    SELECT * 
    FROM [DBName].sys.tables t 
    JOIN [DBName].sys.schemas s 
    ON t.SCHEMA_ID = s.schema_id 
    WHERE 
     t.name = N'TableName' AND t.type='U' 
    AND s.NAME = 'SchemaName' 
) 
    DROP TABLE [DBName].[SchemaName].[TableName]; 

更新:

object_idsys.tables是相同sysobjects同一個表object_id。和完全相同的函數OBJECT_ID返回相同的表名。請參閱下面的說明示例。

所以,你可以簡化查詢:

IF exists 
    (
    SELECT * 
    FROM DBName.sys.tables 
    WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') 
    AND type = 'U' 
) 
    DROP TABLE [DBName].[SchemaName].[TableName]; 

或者這樣:

IF exists 
    (
    SELECT * 
    FROM DBName.sys.objects 
    WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') 
    AND type = 'U' 
) 
    DROP TABLE [DBName].[SchemaName].[TableName]; 

或SQL2000風格表:

IF exists 
    (
    SELECT * 
    FROM DBName..sysobjects 
    WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') 
    AND xtype = 'U' 
) 
    DROP TABLE [DBName].[SchemaName].[TableName]; 
+0

我更新的問題某些系統表不存在的表,你可以檢查它? – Saeid 2012-02-26 07:33:22

+0

已被更新回答。 – 2012-02-26 07:47:13

1

使用此:

IF EXISTS 
(
    SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[DBName].[Schema1].[Member]') 
    AND type in (N'U') 
) 
    PRINT 'Yes' 
ELSE 
    PRINT 'No'; 
+0

我更新的問題,你可以檢查它嗎? – Saeid 2012-02-26 07:34:16

+0

@dotNetist注意 - 由於DB名稱對象的限定 - 可能會從其他DB運行,所以 - 您需要使用DB名稱限定您的sys.objects表格 – 2012-02-26 07:46:52

1

請勿使用sysobjects。利用現代system viewssys架構(2005年推出):

select * from sys.tables 
where 
    schema_id = SCHEMA_ID('Schema1') and 
    name='tablename' 

只要你有一個2005或更高版本數據庫中的一個「現代」的架構,你不能可靠地使用sysobjects來匹配模式。如果您只有「舊」模式(屬於用戶和角色的對象),則可以根據user_id進行查詢。

+0

請注意 - 由於DB對象的限定名稱 - 它可能從其他數據庫運行,其中SCHEMA_ID無用或甚至不好 – 2012-02-26 07:29:08

+0

@Damien_The_Unbeliever我更新問題,可以檢查它嗎? – Saeid 2012-02-26 07:33:06

+1

我肯定會推薦使用'sys.tables',因爲在那裏你找到的任何東西都有一張表,所以不需要進一步的檢查。 – 2012-02-26 07:35:19

0

不會是最簡單的一種剛:

IF object_id('[schema].[table]') > 0 
    DROP TABLE [schema].[table] 

對於object_id()返回NULL

對於它返回一個負int