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

标签 sql sql-server-2008 t-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?

最佳答案

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];

更新:

对于同一个表,sys.tables 中的

object_idsysobjects 中的 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];

关于sql - 如果两个模式中存在名称相似的表,则删除表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451283/

相关文章:

sql - 在 SQL Server 中每小时计算行数,并以完整的日期时间值作为结果

mysql - 连接四个表并连接一个表的结果 - MySQL

php - 如何使用 CodeIgniter 在 SQL Server 数据库中存储多字节字符

sql-server - 在 SQL Server 2008 中的符号之前隔离字符串中的子字符串

sql-server - SQL Server 中的拆分触发器

mysql - 为什么 mysql 在子查询的组连接上返回错误?

mySQL高效统计表

excel - 使用 SSIS 2008 将 Excel 导入 SQL 时跳过行

sql - 聚合 SQL 函数以从每个分组中仅获取一个

sql-server - T-SQL:获取全部,但在 'not null' 上加入