IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Delete d'une table complete [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Par défaut Delete d'une table complete
    Bonjour,

    Je souhaite supprimer les données totales d'une table, j'ai essayé le truncat (ce qui est apparemment le plus performant), mais cela ne fonctionne pas pour toute les tables.
    Certaines tables ont des FK, j'ai essayé de les désactiver (ALTER TABLE [TABLENAME] NOCHECK CONSTRAINT ALL), mais même désactivées j'ai encore un message d'erreur.

    Ensuite j'ai commencé par faire un delete From [TABLENAME], mais j'ai des tables de plusieurs millions d’enregistrements. et cela met des heures...

    J'ai donc écris cette petit fonction T-SQL que j’exécute, et je souhaiterais récupérer ensuite le nombre de lignes supprimées, mais si je fait un return il me met une erreur.

    Comment récupérer la valeur de retour du nombre de lignes modifiées ? J'ai fait un select de ma variable, mais je l'utilise en dotnet, et la fonction est un exécute et non un dataset.

    merci,
    Sébastien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Declare @RowsCount int
    Declare @Current int
    set @RowsCount = 0
    set @Current = 0
     
      WHILE 1 = 1 
        BEGIN 
     
            DELETE TOP(1000) FROM [edprd_SaisiesExpeditionAutomatique]
     
    		set @Current = @@ROWCOUNT;
            SET @RowsCount  = @RowsCount + @Current ;
     
            IF @Current = 0
    		BREAK    
     
        END
     
    	SELECT 'RowsCount' = @RowsCount

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Voici un billet qui aurait pu vous aider
    Il vous suffit de rajouter un filtre AND T.name = 'maTable', et vous aurez le nombre de lignes que votre table contient avant la suppression.

    Lorsqu'on écrit ALTER TABLE [TABLENAME] NOCHECK CONSTRAINT ALL, on désactive la contrainte, mais on ne la supprime pas.

    Si vous faites un DELETE FROM maTable, il est évident que cela va être long, parce que vous faites un DELETE TOP sans clause ORDER BY, ce qui oblige le moteur à calculer cela à chaque itération, et surtout, il faut écrire les changements dans le fichier du journal des transactions.

    Vous pouvez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    DECLARE @now datetime
    	, @i int = 0
     
    WHILE EXISTS
    (
    	SELECT	*
    	FROM	dbo.maTable
    )
    BEGIN
    	SELECT	@now = GETDATE()
    		, @i += 1
     
    	;WITH
    		CTE AS
    		(
    			SELECT	TOP 1000 PK
    			FROM	dbo.maTable
    			ORDER	BY PK
    		)
    	DELETE FROM	dbo.maTable
    	FROM		dbo.maTable AS T
    	INNER JOIN	CTE AS C
    				ON T.PK = C.PK
     
    	PRINT 'Batch n° ' + CAST(@i AS varchar(10)) + ' | Durée : ' + CAST(DATEDIFF(second, @now, GETDATE()) AS varchar(10))
    END
    PK doit en fait être le nom de la colonne qui sert de clé primaire à votre table, si tant est que celle-ci est clustérisée.
    Si ce n'est pas le cas, utilisez la / les colonnes qui supportent l'index cluster de votre table.

    Comme vous connaissez le nombre de lignes de vos tables avec la requête que je vous ai donné, il vous suffit de la diviser par 1000 pour connaître le nombre de batch que vous allez exécuter.

    Notez que vous pouvez connaître le nombre de lignes de vos tables en cliquant sur le nœud Tables de l'Explorateur d'objets de SQL Server Management Studio (F8), et en appuyant sur F7.
    Vous devrez peut-être effectuer un clic droit sur l'en-tête des colonnes pour choisir d'afficher le nombre de lignes.

    @++

  3. #3
    Membre éprouvé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Par défaut Requette
    Bonjour,

    ok je viens d’exécuter la requette pour supprimer mes 22 000 000 de lignes. j'attend le résultat (pour voir si elle s’exécute plus vite, sa serait bien si en plus elle était plus rapide !)

    Pour ce qui est de management studio, c'est justement pour le mettre dans un logiciel que je développe qui permet de remplacer management studio (pas mal de chose qui manque au niveau des synchro ou des copie de base , ...) . donc l'utilisateur qui utilisera mon soft ne vas pas aller dans MStudio pour regarder le nombre de row avant d'effectuer le traitement dans mon soft ...

    merci,

    je reviens vers vous rapidement avec le résultat.

    Cordialement,
    Sébastien

  4. #4
    Membre éprouvé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Par défaut Performance
    Bonjour,

    J'ai tester, la requête es plus lente.
    merci quand même.

    Cordialement,
    Sébastien

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut Delete d'une table complète
    Bon, je suis un peu débutante en SQL Server alors je manque de vocabulaire en la matière :

    Serait-il possible de mémoriser la structure de ta table (colonnes, indexes, etc), de la supprimer puis de la recréer.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Par défaut Truncate
    Bonjour,

    C'est le principe du truncate, le problème est qu'il ne fonctionne pas si il y as des relation, j'aimerai éviter de supprimer toute les relations (je préfère ne pas modifier la structure).

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/10/2009, 16h54
  2. delete dans une table contenant des primary key
    Par bracket dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2008, 17h41
  3. PB Lock sur delete dans une table
    Par greatmaster1971 dans le forum DB2
    Réponses: 10
    Dernier message: 06/07/2008, 20h49
  4. Delete dans une table de jointure
    Par Jexou dans le forum Hibernate
    Réponses: 7
    Dernier message: 12/06/2008, 14h11
  5. probleme de delete sur une table avec somation
    Par galaad666 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo