Est-il possible de tronquer avec une seule instruction SQL, plusieurs tables?
Comme ça:
truncate table #OBJ_AvailabilityTraining, #OBJ_AvailabilityHoliday, #Dates_temp;
Cordialement
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.
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
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')
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
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_%';
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;
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.