我有像lg-010-a ......,lg-010-ac ......等表,我有abc数据库,
我有一个命令窗口:
drop table from abc where Table_Name like 'lg-010-%'
这会丢弃所有以lg-010开头的表 - ?
答案 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