如果在两个模式中存在具有相似名称的删除表

时间:2012-02-26 07:19:35

标签: sql sql-server-2008 tsql

我使用此命令删除sql-server 2008中的表

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

但是现在我在不同架构中有两个同名的表:

[DBName].[Schema1].[Members]

 [DBName].[Schema2].[Members]

那么,你有什么建议检查这个表是否存在?如何使用架构检查表名?

更新

好的,有3个不同的答案,所有这些都有效,所以我不知道哪个更好,有人知道使用object_id还是sys.tables

4 个答案:

答案 0 :(得分: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_id中的{p> sys.tablesobject_id中同一个表中的sysobjects相同。并且与函数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];

答案 1 :(得分: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';

答案 2 :(得分:1)

请勿使用sysobjects。使用sys架构中的现代system views(2005年推出):

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

只要在2005或更高版本的数据库中有一个“现代”模式,就不能可靠地使用sysobjects来匹配模式。如果您只有“旧”架构(属于用户和角色的对象),您可以根据user_id进行查询。

答案 3 :(得分:0)

最简单的只是:

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

对于不存在的表object_id(),返回NULL

对于某些系统表,它返回负int