web-dev-qa-db-fra.com

Tronquer avec la clause where

Puis-je utiliser la commande truncate avec une clause where? J'ai besoin de supprimer des lignes spécifiques de plusieurs tables.

Comment puis-je supprimer des données spécifiques de toute la base de données?

SELECT DimEmployee.[FirstName], DimEmployee.[LastName], [SalesOrderNumber], [ShipDateKey]
    FROM DimEmployee
    JOIN [FactResellerSales] 
        ON DimEmployee.[EmployeeKey] = [FactResellerSales].[ProductKey] 
    WHERE DimEmployee.[FirstName] like 'kevin%' <--have to truncate this specific name from entire DB

Existe-t-il une autre méthode pour supprimer des données spécifiques de la base de données entière?

Dans ma base de données, il y a 172 tables. Je voulais supprimer un nom spécifique et ses colonnes correspondantes de la base de données entière. Le nom est réparti sur toute la base de données, donc je veux le supprimer en une seule fois au lieu d'aller dans chaque table et de le supprimer individuellement.

4
l.lijith

Non, Truncate ne peut pas être utilisé avec une clause WHERE. Tronquer désalloue simplement toutes les pages appartenant à une table (ou une partition) et ses index.

De BOL :

-- Syntax for SQL Server and Azure SQL Database  

TRUNCATE TABLE   
    [ { database_name .[ schema_name ] . | schema_name . } ]  
    table_name  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  

Si vous cherchez un moyen plus efficace de supprimer des données, je commencer ici .

10
Erik Darling

Il existe trois méthodes de suppression dans le serveur SQL: Truncate, Delete, Drop

DROP, TRUNCATE sont des commandes DDL (DROP est utilisé pour supprimer des objets comme des tables, des colonnes, des contraintes, ... mais pas des lignes)

DELETE est une commande DML.

"TRUNCATE Supprime toutes les lignes d'une table sans enregistrer les suppressions de lignes individuelles. TRUNCATE TABLE est similaire à l'instruction DELETE sans clause WHERE; cependant, TRUNCATE TABLE est plus rapide et utilise moins de ressources système et de journal des transactions ..." En savoir plus

Vous devez créer une commande en utilisant un SQL dynamique et l'exécuter: (quelque chose comme cette requête)

DECLARE @strquery as NVARCHAR(MAX)

SET @strquery = ''
SELECT 'Delete T2 from [' + Table_name + '] As T2
Inner join  DimEmployee as T1 
On T1.[EmployeeKey] = T2.[ProductKey] 
Where    T1.[FirstName] like ''kevin%'';'
 From information_schema.tables
 WHERE table_name <> 'DimEmployee'


EXEC(@strquery)

Liens utiles

4
Hadi