Удалить таблицы по маске

Александр Злобин

А можно удалить все таблицы с именами по маске? (как в LIKE) Например, все таблицы, начинающиеся с некоторой последовательности знаков...
10 ответов

Александр Злобин

динамический sql вам в помощь


Александр Злобин

динамический sql вам в помощь
а если быть конкретней?


Александр Злобин

DECLARE @sql VARCHAR(MAX) ,
 @tablename VARCHAR(MAX)

DECLARE droptable CURSOR FOR 
SELECT *
FROM sys.tables 
WHERE type='U' AND name LIKE '%123%'
OPEN droptable
FETCH NEXT FROM droptable 
INTO @tablename
WHILE @@FETCH_STATUS = <b>0</b> 
 BEGIN
 SET @sql = 'drop table [' + @tablename + ']'
 PRINT @sql
 EXEC (@sql)
 FETCH NEXT
 FROM droptable
 INTO @tablename
 END

CLOSE droptable
DEALLOCATE droptable


Александр Злобин

ошибся чутокь
DECLARE @sql VARCHAR(MAX) ,
 @tablename VARCHAR(MAX)

DECLARE droptable CURSOR FOR 
SELECT name
FROM sys.tables 
WHERE type='U' AND name LIKE '%123%'
OPEN droptable
FETCH NEXT FROM droptable 
INTO @tablename
WHILE @@FETCH_STATUS = <b>0</b> 
 BEGIN
 SET @sql = 'drop table [' + @tablename + ']'
 PRINT @sql
 EXEC (@sql)
 FETCH NEXT
 FROM droptable
 INTO @tablename
 END

CLOSE droptable
DEALLOCATE droptable


Александр Злобин

А можно удалить все таблицы с именами по маске?
хакер?


Александр Злобин

Специально для хакеров :)с использованием Microsoft SQL Server 2008 Express
set nocount on;

create table boo
(boo_id integer primary key);
create table foo
(foo_id integer primary key);
create table goo
(goo_id integer primary key);
create table boobar
(boobar_id integer primary key);
create table foobar
(foobar_id integer primary key);
create table goobar
(goobar_id integer primary key);

exec sp_msforeachtable
 @command1 = 'drop table ?'
 , @whereand = 'and o.name like N''%bar%'''
;

select name from sys.tables;
хотя удалить все можно и без имен по маске :)


Александр Злобин

Специально для хакеров :)с использованием Microsoft SQL Server 2008 Express
set nocount on;

create table boo
(boo_id integer primary key);
create table foo
(foo_id integer primary key);
create table goo
(goo_id integer primary key);
create table boobar
(boobar_id integer primary key);
create table foobar
(foobar_id integer primary key);
create table goobar
(goobar_id integer primary key);

exec sp_msforeachtable
 @command1 = 'drop table ?'
 , @whereand = 'and o.name like N''%bar%'''
;

select name from sys.tables;
хотя удалить все можно и без имен по маске :)
А теперь давайте добавим FOREIGN KEYs и попробуем ещё раз.Ну что, не получается каменный цветок?


Александр Злобин

А теперь давайте добавим FOREIGN KEYs и попробуем ещё раз.Ну что, не получается каменный цветок?
Почему?
set nocount on;
go
create login dropper with password = N'1qazxsw2';
go
create user dropper for login dropper with default_schema = dropper;
go
create schema dropper authorization dropper;
go
create table boobar(boobar_id integer primary key);
create table boo
( boo_id integer primary key
, boobar_id integer unique foreign key references boobar );
go
grant create table to dropper;
grant references (boobar_id) on dbo.boo to dropper;
go
execute as user = N'dropper';
go
create table foobar(foobar_id integer primary key);
go
create table foo
( foo_id integer primary key
, foobar_id integer foreign key references foobar
, boobar_id integer foreign key references dbo.boo(boobar_id) );
go
revert
go
create schema dropping authorization dbo
create table goobar(goobar_id integer primary key)
create table goo
( goo_id integer primary key
, goobar_id integer foreign key references goobar
, boobar_id integer foreign key references dropper.foo
, foo_id integer foreign key references dropper.foo );
go

declare @tn nvarchar(<b>256</b>), @dc nvarchar(<b>1024</b>), @oid integer;
while exists(select *
 from sys.tables
 where name like N'%bar%') begin
 select @tn = N'[' + schema_name(schema_id) + N'].[' + name + N']'
 from sys.tables
 where name like N'%bar%'
 print @tn;
 select @oid = object_id(@tn);
 while exists(select *
 from sys.foreign_keys
 where referenced_object_id = @oid) begin
 select @dc = N'alter table ['
 + object_schema_name(parent_object_id)
 + N'].[' + object_name(parent_object_id)
 + N'] drop constraint [' + name + N'];'
 from sys.foreign_keys
 where referenced_object_id = @oid;
 print @dc;
 execute sp_executesql @dc;
 end;
 select @dc = N'drop table ' + @tn;
 print @dc;
 execute sp_executesql @dc;
end;
go
select * from sys.tables where name like N'%oo%';
/*
drop table dropping.goo, dropper.foo, boo;
drop table dropping.goobar, dropper.foobar, boobar;
drop schema dropping;
drop schema dropper;
drop user dropper;
drop login dropper;
*/


Александр Злобин

Почему?
Что - "почему"? Потому что Ваш скрипт, к которому относятся процитированные слова, ничего не делал с констрейнтами.Вы же поняли, о чём это я, раз написали усовершенствованный скрипт.А вот ещё есть такая штука, как SCHEMABINDING.Если VIEW или FUNCTION созданы с этой опцией и обращаются к таблице,то такую таблицу тоже так просто не удалишь...


Александр Злобин

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