web-dev-qa-db-fra.com

Tronquer plusieurs tables dans une instruction MySQL

Est-il possible de tronquer avec une seule instruction SQL, plusieurs tables?

Comme ça:

 truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;

Cordialement

16
user2206834

Non, vous ne pouvez tronquer qu'une seule table avec la commande TRUNCATE. Pour tronquer plusieurs tables, vous pouvez utiliser T-SQL et parcourir les noms de table pour les tronquer à la fois.

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

Vous pouvez avoir tous vos noms de table séparés par des virgules dans la variable @tableList et oui, vous pouvez tronquer plusieurs tables de différents schémas si elles sont préfixées.

5
IndoKnight

Vous pouvez utiliser la procédure stockée sp_MSforeachtable de la manière suivante:

USE MyDatabase
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?'

Ou vous pouvez créer une instruction SQL

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

et exécutez cette instruction SQL ci-dessus

8
Pankaj Agarwal

Non, mais il y a une alternative:

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

Exemple :

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

Vous avez maintenant ci-dessous Résultats pour Select ci-dessus Requête

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

ou vous pouvez utiliser quelque chose comme

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

Lien 1

Lien 2

Mettre à jour:

Regarder la table dans votre exemple Query dans votre question

truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp

Je pense que vous voulez Truncate toutes les tables temporaires.

Vous pouvez le faire avec un simple Query comme ceci

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

Exemple de bonus, tronquez toutes les tables d'une base de données en commençant par une chaîne ...

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

Entrez simplement cette déclaration MySQL:

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

...etc.

Changez le votrenom de table avec le vôtre.

N'oubliez pas le point-virgule;

1

J'ai eu à changer le code envoyé par IndoKnight parce que cela me jette une erreur dans l'instruction truncate donc je change le code par ceci, c'est assez similaire mais la partie tronquée

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

L'astuce consiste à utiliser QUOTENAME pour mettre les crochets entre le nom et le schéma de la table. Peut-être que la solution IndoKnight ne fonctionne plus dans les versions les plus récentes de la base de données. J'espère que ça aide.

0
Xavi Duro