Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用字符串删除多个表_Sql Server - Fatal编程技术网

Sql server 使用字符串删除多个表

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

我有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_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