Sql server 使用字符串删除多个表
我有lg-010-a,lg-010-ac等表格,我有abc数据库 我有一个命令窗口:Sql server 使用字符串删除多个表,sql-server,Sql Server,我有lg-010-a,lg-010-ac等表格,我有abc数据库 我有一个命令窗口: drop table from abc where Table_Name like 'lg-010-%' 这会删除所有以lg-010-开头的表格吗?不幸的是,你不能这样做。 一种方法是: DECLARE @TableName NVARCHAR(128) SELECT TOP 1 @TableName = TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE
drop table from abc where Table_Name like 'lg-010-%'
这会删除所有以lg-010-开头的表格吗?不幸的是,你不能这样做。 一种方法是:
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
SELECT 'DROP TABLE ' + name FROM sysobjects WHERE name LIKE '%lg-010-a%' AND [type] IN ('P')
这将只打印出每个表的DROP TABLE语句,然后您可以复制并粘贴此输出并运行它。您只需在循环中放入一个EXECUTE,而不是打印,但我这样做是为了让您可以先查看发生了什么/检查输出。尝试以下方法:
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)
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
这将查询INFORMATION_SCHEMA.TABLES表以检索符合条件的表名,然后将它们连接到一个逗号分隔的字符串中
然后将此字符串添加到“Drop table”语句中并执行
Drop table可以采用多个逗号分隔的表名
我最初有这个查询sys.tables,但一些研究表明,虽然它们目前是等效的,但信息模式方法保证在未来的版本中工作不幸的是,您不能这样做。一种方法是:
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
SELECT 'DROP TABLE ' + name FROM sysobjects WHERE name LIKE '%lg-010-a%' AND [type] IN ('P')
这将只打印出每个表的DROP TABLE语句,然后您可以复制并粘贴此输出并运行它。您可以只在循环中放入一个EXECUTE,而不是打印,但我这样做是为了让您可以看到发生了什么/首先检查输出。我遇到了一个问题,接受的答案没有做任何事情。我发现我必须将数据库的前缀名称添加到代码中才能使其工作。如果您的表不是dbo.tablename,请尝试此操作
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
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