2011-02-01 7 views
18

В оракулом, чтобы удалить все таблицы и ограничение вы печатаете что-то вродеSQL Server: каскадный эквивалент таблицы капель?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

, и это будет полностью удалить таблицы и их зависимости. Что такое SQL-сервер?

+0

ответил: http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle

ответ

22

Я не верю, что SQL имеет столь же элегантное решение. Перед тем, как вы удалите таблицу, вам необходимо отбросить все связанные ограничения.

К счастью, все это хранится в информационной схеме, и вы можете получить доступ к этому, чтобы получить свой список ударов.

Этот блог пост должен быть в состоянии получить, что вам нужно: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table 
DECLARE @database nvarchar(50) 
DECLARE @table nvarchar(50) 

set @database = 'DatabaseName' 
set @table = 'TableName' 

DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    exec sp_executesql @sql 
END 
29

В среде SQL Server Management Studio, перейдите в Параметры/SQL Object Server Explorer/сценариев, а также включить «Создать сценарий для зависимых объекты'. Затем щелкните правой кнопкой мыши таблицу, сценарий> drop to> new query window, и он будет генерировать его для вас.

+0

Также работает для удаления всех объектов в db. Еще один пример потрясающей силы ssms. спасал меня, скриптируя это сам из sys.objects !! –

+1

Не очень хорошее решение для OP, теперь я понимаю, почему он отключен по умолчанию.Как-то все таблицы «зависимы» от таблицы «ContactInfo» ... ugh ... –

5

Это может быть ужасное решение, но я считаю, что это быстро. Это похоже на ответ Винни, но продукт оператора SQL представляет собой еще одну серию операторов SQL, которая удалит все ограничения и таблицы.

(
select 
    'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
    ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
where 
    t.table_name = tc.table_name 
    and tc.constraint_name not like '%_pk' 
    and tc.constraint_name not like 'pk_%' 
    and t.table_catalog='<schema>' 
) UNION (
select 
    'DROP TABLE ' + t.table_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
where 
    t.table_catalog='<schema>' 
) 
1

В конечном счете мы удаляем наш стол. Таким образом, мы можем просто запустить 2 следующую команду:

ALTER TABLE ... DROP CONSTRAINT ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE;

- Имя таблицы и имя ограничения являются параметр

2> DROP TABLE.

Ограничение первой кавычки с указанием связанного с ней имени таблицы Во-вторых, вы можете отказаться от таблицы.

Это сработало для меня и его легко.

1

Это все развлечения и игры, пока некоторые таблицы не ссылается на таблицу ...

Тогда я должен изменить код при условии, например, так:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL 
as 
DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME 
     from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on 
        (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and 
        rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on 
        (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and 
        tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME) 
    where tc.constraint_catalog = @database 
     and tc_pk.TABLE_NAME = @table 
    exec sp_executesql @sql 
END 
go 
0

мне просто нужно удалить внешний ключ

DECLARE @database nvarchar(50) 
DECLARE @TABLE_NAME nvarchar(250) 
DECLARE @CONSTRAINT_NAME nvarchar(250) 
DECLARE @sql nvarchar(350) 
set @database = 'XXX' 


DECLARE db_cursor CURSOR FOR 
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    select @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @TABLE_NAME 
    exec sp_executesql @sql 

     FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

 Смежные вопросы

  • Нет связанных вопросов^_^