2010-01-05 37 views
2

多个表我的表像LG-010-A ...,LG-010-AC ......,等等,我有ABC数据库,删除与字符串

我有一个命令行窗口:

drop table from abc where Table_Name like 'lg-010-%' 

这会删除所有以lg-010-开头的表吗?

回答

0

不幸的是,你不能这样做。 一种方法是:

DECLARE @TableName NVARCHAR(128) 
SELECT TOP 1 @TableName = TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'lg-010-%' 
ORDER BY TABLE_NAME ASC 

WHILE (@@ROWCOUNT > 0) 
    BEGIN 
     PRINT 'DROP TABLE [' + @TableName + ']' 

     SELECT TOP 1 @TableName = TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES 
      WHERE TABLE_NAME LIKE 'lg-010-%' 
      AND TABLE_NAME > @TableName 
     ORDER BY TABLE_NAME ASC 
    END 

这将只打印出DROP TABLE语句为每个表 - 那么你可以复制并粘贴此输出,并运行它。你可以在循环中放入一个EXECUTE而不是PRINT,但我已经这样做了,所以你可以先看看发生了什么/检查输出。

4

尝试这样:

declare @sql varchar(max) 
declare @tablenames varchar(max) 

select @tablenames = coalesce(@tablenames + ', ','') + Table_Name from INFORMATION_SCHEMA.TABLES  
where Table_Name like ('lg-010-%') 

set @sql = 'drop table ' + @tablenames 

exec (@sql) 

此查询INFORMATION_SCHEMA.TABLES表检索符合条件的表名,然后将其连接在一起成一个逗号分隔的字符串。

该字符串被添加到“Drop table”语句并执行。

Drop table可以采用多个以逗号分隔的表名。

(本来我有这个查询SYS.TABLES但一些研究显示,虽然他们目前相等,则INFORMATION_SCHEMA方法quaranteed在以后的版本中工作)

1

可惜你不能那样做。一种方法是:

SELECT 'DROP TABLE ' + name FROM sysobjects WHERE name LIKE '%lg-010-a%' AND [type] IN ('P') 

这将只是打印出每个表的DROP TABLE语句 - 然后您可以复制并粘贴此输出并运行它。你可以在循环中放入一个EXECUTE而不是PRINT,但我已经这样做了,所以你可以先看看发生了什么/检查输出。