使用字符串删除多个表

时间:2010-01-05 08:24:41

标签: sql-server

我有像lg-010-a ......,lg-010-ac ......等表,我有abc数据库,

我有一个命令窗口:

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

这会丢弃所有以lg-010开头的表 - ?

5 个答案:

答案 0 :(得分: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可以使用多个逗号分隔的表名。

(我最初有这个查询sys.tables但是一些研究表明,虽然它们当前是等效的,但是Info_Schema方法可以保证在将来的版本中工作)

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

我遇到一个问题,即被接受的答案没有做任何事情。我发现必须将数据库的前缀名称添加到代码中才能使其正常工作。如果您的表不是dbo.tablename,请尝试此操作。

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

SELECT 
    @tablenames = COALESCE(@tablenames + ', ','') + 'YourDatabaseName.' + Table_Name 

FROM 
    INFORMATION_SCHEMA.TABLES    
WHERE TABLE_TYPE  = 'BASE TABLE' 
    AND TABLE_NAME LIKE 'AP2%'
    AND (RIGHT(TABLE_NAME, 6) < 201708)

SET @sql = 'drop table ' + @tablenames

EXEC (@sql)
GO

答案 3 :(得分: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语句 - 然后您可以复制并粘贴此输出并运行它。你可以在循环而不是PRINT中放置一个EXECUTE,但我已经这样做了,所以你可以看到正在发生的事情/先检查输出。

答案 4 :(得分:0)

CREATE PROCEDURE dbo.drop_MsSqlTables1 @createDate smalldatetime

AS

declare @flag int =1

declare @tname varchar(50)

declare @sql varchar(max)

select row_number() over (order by name) as num, '[dbo].[' + name +']' as table_name into #temp from sys.tables where name like ('EmpInfo_%') and create_date<@createDate

declare @count int = (select count(*) from #temp)

select * from #temp

while @flag <= @count

    begin

     set @tname = (select table_name from #temp where num = @flag)

     set @sql = 'drop table ' + @tname 

     exec (@sql)

     set @flag = @flag+1
    end