小编典典

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

sql

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

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]

那么,您对检查此表是否存在的建议是什么?如何使用架构检查表名?

更新:

好的,有3个不同的答案,并且所有答案都有效,所以我不知道哪个更好,有人知道使用object_idsys.tables吗?


阅读 189

收藏
2021-04-28

共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相同object_idsysobjects同一个表。并且与函数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];
2021-04-28