用一条SQL语句截断多个表

问题描述 投票:0回答:6

是否可以用一条 SQL 语句、多个表进行截断?

像这样:

 truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;

问候

sql truncate
6个回答
15
投票

不可以,您只能使用 TRUNCATE 命令截断单个表。要截断多个表,您可以使用 T-SQL 并迭代表名称以一次截断每个表。

DECLARE @delimiter CHAR(1),
        @tableList VARCHAR(MAX),
        @tableName VARCHAR(20),
        @currLen INT

SET @delimiter = ','

SET @tableList = 'table1,table2,table3'

WHILE LEN(@tableList) > 0
BEGIN
    SELECT @currLen = 
    (
        CASE charindex( @delimiter, @tableList ) 
            WHEN 0 THEN len( @tableList  ) 
            ELSE ( charindex( @delimiter, @tableList  ) -1 )
        END
    ) 

    SELECT @tableName = SUBSTRING (@tableList,1,@currLen )

    TRUNCATE TABLE @tableName

    SELECT tableList = 
    (
        CASE ( len( @tableList ) - @currLen  ) 
            WHEN 0 THEN '' 
            ELSE right( @tableList, len( @tableList ) - @currLen  - 1 ) 
        END
    ) 
END

您可以将所有表名在 @tableList 变量中用逗号分隔,是的,您可以截断来自不同模式的多个表(如果它们有前缀)。


14
投票

您可以像这样使用 sp_MSforeachtable 存储过程:

USE MyDatabase
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?'

或者您可以创建SQL语句

SELECT concat('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TableName%'

并运行上面的 SQL 语句


10
投票

不。但还有一个替代方案:

SELECT 'TRUNCATE TABLE '+TABLE_NAME+ ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'your-table-name%'

示例:

SELECT 'TRUNCATE TABLE '+TABLE_NAME+ ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TBL_ORDERS_20%'

现在您有上述结果

Select
查询

TRUNCATE TABLE TBL_ORDERS_2001
TRUNCATE TABLE TBL_ORDERS_2002
TRUNCATE TABLE TBL_ORDERS_2003
TRUNCATE TABLE TBL_ORDERS_2004

或者你可以使用类似的东西

select 'Truncate table ' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('Table1', 'Table2')

链接1

链接2

更新:

查看示例中的表格

Query
问题中的

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

我想你想要

Truncate
所有临时表

您可以通过像这样的简单

Query
来做到这一点

select 'Truncate table ' + TABLE_NAME from tempdb.INFORMATION_SCHEMA.TABLES

9
投票

只需轻松输入此MySQL语句:

TRUNCATE TABLE yourtablename1;
TRUNCATE TABLE yourtablename2;
TRUNCATE TABLE yourtablename3;

... 等等。

yourtablename 更改为您的。

不要忘记分号;


3
投票

额外示例,截断一个数据库中以字符串开头的所有表...

SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'my_database_name'
  AND TABLE_NAME LIKE 'cache_%';

1
投票

我必须更改 IndoKnight 发送的代码,因为它在 truncate 语句中引发错误,所以我通过此更改代码,它非常相似,但截断部分:

DECLARE @delimiter CHAR(1),
        @tableList VARCHAR(MAX),
        @tableName VARCHAR(100),
        @currLen INT,
        @truncateStatement VARCHAR(200)

SET @delimiter = ','

SELECT @tableList = COALESCE(@tableList + ', ','') + CAST (TABLE_NAME AS varchar(100))
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'xxx'

    WHILE LEN(@tableList) > 0
    BEGIN
        SELECT @currLen = 
        (
            CASE charindex( @delimiter, @tableList ) 
                WHEN 0 THEN len( @tableList  ) 
                ELSE ( charindex( @delimiter, @tableList  ) -1 )
            END
        ) 

        SELECT @tableName = TRIM(SUBSTRING (@tableList,1,@currLen ))

        SET @truncateStatement = 'TRUNCATE TABLE ' + QUOTENAME('xxx') + '.' + QUOTENAME(@tableName)
        EXEC (@truncateStatement)

        SELECT @tableList = 
        (
            CASE ( len( @tableList ) - @currLen  ) 
                WHEN 0 THEN '' 
                ELSE right( @tableList, len( @tableList ) - @currLen  - 1 ) 
            END
        ) 
    END

技巧是使用 QUOTENAME 将方括号放在表名称和模式中。也许 IndoKnight 解决方案在更新版本的数据库中不再起作用。我希望它有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.