Удалить таблицу, если существует с похожим именем в двух схемах - PullRequest
2 голосов
/ 26 февраля 2012

Я использую эту команду для удаления таблицы в 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_id или sys.tables?

Ответы [ 4 ]

1 голос
/ 26 февраля 2012

Используйте это:

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';
1 голос
/ 26 февраля 2012

Не используйте sysobjects. Используйте современные системные представления в схеме sys (выпущенной в 2005 году):

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

Как только у вас есть одна "современная" схема в базе данных 2005 или новее, вы не можете надежно использовать sysobjects для сопоставления со схемами. Если у вас есть только «старые» схемы (объекты, принадлежащие пользователям и ролям), вы можете выполнять запросы на основе user_id.

1 голос
/ 26 февраля 2012
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 в sys.tables совпадает с object_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];
0 голосов
/ 24 сентября 2014

Не было бы проще всего:

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

Для несуществующих таблиц object_id() возвращает NULL

Для некоторых системных таблиц возвращает отрицательное значение int

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...