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 :

pb avec requête UPDATE sous SQL 2008


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut pb avec requête UPDATE sous SQL 2008
    Bonjour,
    je fais une requête simple de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'abacourt')
    UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'Abainville')
    MAIS ici j'ai mis 2 lignes, moi j'en ai environ 98000.

    Lorsque je clique sur 'Exécuter', SQL 2008 me renvoie l'erreur :
    TITRE*: Microsoft SQL Server Management Studio
    ------------------------------

    Impossible d'exécuter le script.

    ------------------------------
    INFORMATIONS SUPPLÉMENTAIRES*:

    Une exception de type 'System.OutOfMemoryException' a été levée. (mscorlib)

    ------------------------------
    BOUTONS*:

    OK
    ------------------------------

    Savez-vous pourquoi il ne veut pas ? et surtout comment le faire par requête ?

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    ça donne quoi si tu mets BEGIN ... END ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BEGIN
    UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'abacourt')
    ...........
    ..........
    UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'Abainville')
    END
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut
    Merci pour ta proposition.


    ça fait pareil ! cela plante
    Une exception de type 'System.OutOfMemoryException' a été levée. (mscorlib)

  4. #4
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Au fait il y a un problème de mémoire.

    Tu seras obligé d'exécuter tes requêtes en plusieurs étapes.

    Commence par des lots de 1000 pour voir.
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Quelle est la configuration de votre serveur ?
    De combien de mémoire disposez vous et quelle est la quantité de mémoire libre ?

    Je suppose que vous lancez votre requête depuis un SSMS local à votre instance SQL Server ?

    ++

  6. #6
    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 : 43
    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 u
    Bonjour,

    Pour avoir à générer puis exécuter ce style de scripts assez souvent, j'ai eu le même problème que vous au début.
    C'est une erreur purement SQL Server Management Studio, car il ne parvient pas à gérer l'ensemble du texte de la requête ou du lot de requêtes.
    Il vous arrivera la même chose si vous tentez de changer des caractères avec la fonctionnalité de recherche et remplacement sur une suite de requêtes très longue.

    Ce que j'ai donc fait dans ces cas là c'est créer une table dans laquelle je stocke les instructions à exécuter en les précédant d'un 'GO' + CHAR(13) + CHAR(10) toutes les 1000 lignes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT	maTableExport(script_line)
    	SELECT	CASE
    			WHEN n % 1000 = 0 THEN 'GO' + CHAR(13) + CHAR(10)
    			ELSE ''
    		END + 'UPDATE F_COMPTET SET CT_Pays = ''' + maColonne + 'WHERE CT_Ville= ''' + monAutreColonne + ''')
    	FROM	mesTables

    La colonne n est une colonne de type entier avec la propriété d'auto-incrémentation, que je peuple avant.

    Et pour générer le fichier de script, j'utilise BCP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @bcp_command varchar(256) = 'BCP "SELECT script_line FROM maBD.dbo.maTableExport" queryout C:\monDossier\monFichier.txt -T -c'
     
    EXEC xp_cmdshell @bcp_command
    .

    En outre, vous pourriez construire votre batch autrement, pour n'avoir à faire qu'un seul UPDATE, ce qui éviterait d'avoir à lire la table autant de fois que vous avez d'instructions dans votre lot.
    Pour cela vous pouvez recourir à une table temporaire (#table) si vous n'avez pas un grand nombre de valeurs, ou à une table de base que vous créez et supprimez respectivement au début et à la fin du batch.
    Dans votre cas :

    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
    CREATE TABLE #affecte_pays
    (
        CT_Pays varchar(32) NOT NULL
        , CT_Ville varchar(32) NOT NULL
    )
     
    INSERT    #affecte_pays VALUES
    ('FRANCE', 'abacourt')
    , ...
    , ('FRANCE', 'Abainville')
    GO
     
    UPDATE        dbo.F_COMPTET
    SET        CT_Pays = TMP.CT_Pays
    FROM        dbo.F_COMPTET AS C
    INNER JOIN    #affecte_pays AS TMP
                ON C.CT_Ville = TMP.CT_Ville
    GO
     
    DROP TABLE #affecte_pays
    GO
    Le jeu d'instructions est le même pour une table de base.
    La seule différence c'est que lorsque vous utilisez une table temporaire, celle-ci est stockée dans TempDB, qui est une base de données utilisée pour bien d'autres choses par le moteur de bases de données.
    Donc en utilisant une telle table, vous le dérangez un peu.

    Notez au passage qu'effectuer une jointure sur des chaînes de caractères est assez contre-performant comparé à une jointure sur des entiers

    @++

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

Discussions similaires

  1. Requête longue sous SQL 2008 R2
    Par fdenis31 dans le forum Administration
    Réponses: 18
    Dernier message: 29/02/2012, 10h10
  2. problème requète avec les dates sous sql server
    Par fayabones dans le forum Développement
    Réponses: 2
    Dernier message: 04/06/2009, 22h27
  3. [VB6] Problème avec requête Update
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2006, 03h40
  4. syntaxe d'un update sous SQL SERVER
    Par wello00 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 14h13
  5. Pb avec DROP COLUMN sous SQL Server 2000
    Par debailleul dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/03/2004, 14h38

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