在一条MySQL语句中截断多个表

在一条MySQL语句中截断多个表,sql,truncate,Sql,Truncate,是否有可能使用一条SQL语句、多个表进行截断 像这样: truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp; 关于否,您只能使用truncate命令截断单个表。要截断多个表,可以使用T-SQL并遍历表名一次截断每个表 DECLARE @delimiter CHAR(1), @tableList VARCHAR(MAX), @tableName VARCH

是否有可能使用一条SQL语句、多个表进行截断

像这样:

 truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;

关于

否,您只能使用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变量中以逗号分隔所有表名,是的,您可以从不同的模式中截断多个表(如果它们带有前缀)。

您可以使用spmsforeachtable存储过程,如下所示:

USE MyDatabase
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?'
也可以创建SQL语句

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

然后运行上面的SQL语句

否。但是还有一种选择:

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%'
现在您对上述
选择
Query

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')

更新:

SELECT 'TRUNCATE TABLE '+TABLE_NAME+ ';'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TBL_ORDERS_20%'
查看您的问题中示例
Query
中的表

truncate table#OBJ#u availability training、#OBJ#u availability holiday、#Dates#temp

我想您想
截断所有临时表

您可以通过这样一个简单的
查询

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

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

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

只需轻松输入以下MySQL语句:

TRUNCATE TABLE yourtablename1;
TRUNCATE TABLE yourtablename2;
TRUNCATE TABLE yourtablename3;
。。。 等等

您的表名更改为您的


别忘了分号

我不得不更改IndowKnight发送的代码,因为它在truncate语句中抛出了一个错误,所以我通过以下方式更改代码,它非常类似,但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将方括号放在表名和模式上。也许IndowKnight解决方案在较新版本的数据库中不再有效。我希望有帮助。

太好了。我在SSIS中使用execSQL获取列表,并使用foreach循环迭代每个列表。我想你也可以用光标在SSMS中做同样的事情。
sp_MSforeachtable
是MSSQL,这个问题是MySQL。我个人必须使用
SELECT concat('Truncate table',table_NAME)
来获得正确的输出。但是谢谢你的总体想法!问题是一条sql语句;)