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

MS SQL Server Discussion :

[Server SQL 2000] Erreur sur une "stored procedure"


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut [Server SQL 2000] Erreur sur une "stored procedure"
    Bonjour,
    j'ai une erreur sur un de mes scripts et je ne comprend pas pourquoi...
    *ce script fonctionne trés bien sur une autre machine, avec une base qui à la même structure mais pas le même contenu*
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    CREATE PROCEDURE SP_REC_PURGE
    @p_nb_jour int 
    AS
     
      -- Declaration  and initialisation de la variable de sauvegarde de @@Error.
      DECLARE @ErrorSave INT
      SET @ErrorSave = 0
     
      -- Déclaration du status du curseur
      DECLARE @Statuscursor INT
      SET @Statuscursor = 0
     
     
     
      DECLARE @li_nbre_of As Int
      -- Déclaration des variables 
      DECLARE @Id_Rec			AS varchar(10)
      DECLARE @Vers_Rec			AS int
      -- Déclaration du curseur de la recherche des recettes
      DECLARE search_rec CURSOR LOCAL FOR
      Select ID_REC,
             VERS_REC
        From rec
       Where ETAT_REC	= 2
         and DATE_MODIF	<= getdate() - @p_nb_jour
     
      -- Recherche des recettes
      Open search_rec
      Fetch next from search_rec Into @Id_Rec,@Vers_Rec
       -- Tant que la liste des recettes n'est pas terminée 
      While @@Fetch_Status = 0
      Begin
      	set set @li_nbre_of  = 0
      	Begin transaction
            set @li_nbre_of  =  (select count(*) 
                                   from ord_fab 
                                  where id_rec = @Id_Rec
                                    and vers_rec = @Vers_Rec)
            if (@li_nbre_of = 0)
    	Begin
              delete rec where id_rec = @Id_Rec
                           and vers_rec = @Vers_Rec
              set @ErrorSave = @@Error
              If (@ErrorSave = 0) 
              Begin
                Commit transaction
              End
              Else
              Begin
                Rollback transaction          
              End 
            End
        -- Positionnement sur l'enregistrement suivant
        Fetch next from search_rec Into @Id_Rec,@Vers_Rec
      End 
      Close search_rec 
      Deallocate search_rec 
     
    GO
    mon job qui permet d'éxecuter cette procedure,
    est donc en croix avec le message suivant
    The job failed. The Job was invoked by User ****. The las step to run was step 1 (PURGE)
    si je demande des détails
    Executed as user: AUTORITE NT\SYSTEM.
    Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION satetement is missing.
    Previous count = 0, current count = 9.
    [SQLSTATE 25000](Error 266)
    Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing.
    Previous count = 0, current count = 9.
    [SQLSTATE 25000](Error 266)
    The step failed.
    si je rajoute PRINT @@TRANCOUNT dans mon script
    Executed as user: AUTORITE NT\SYSTEM.
    1 [SQLSTATE 01000](Message 0)
    2 [SQLSTATE 01000](Message 0)
    3 [SQLSTATE 01000](Message 0)
    4 [SQLSTATE 01000](Message 0)
    5 [SQLSTATE 01000](Message 0)
    6 [SQLSTATE 01000](Message 0)
    7 [SQLSTATE 01000](Message 0)
    8 [SQLSTATE 01000](Message 0)
    9 [SQLSTATE 01000](Message 0)
    Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION satetement is missing.
    Previous count = 0, current count = 9.
    [SQLSTATE 25000](Error 266)
    Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing.
    Previous count = 0, current count = 9.
    [SQLSTATE 25000](Error 266)
    The step failed.
    rien de nouverau,
    il me dit juste qu'il compte 9 fois mais je comprend pas ce qui le dérange avec le Previous count = 0, current count = 9

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    A quoi servent vos commit et rollback dans votre cas?
    Vous initialisez une transaction dans chacun de vos passage dans le curseur... que vous rollbackez si votre delete déclenche une erreur... or c'est la seule instruction de votre transaction?

  3. #3
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Dans le cas ou
    IF (@li_nbre_of = 0)
    Vous ne rollbackez pas la transaction ouverte...

    vous êtes surement dans le cas ou dans chaque boulce @li_nbre_of=0

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    De plus votre curseur est complètement inutile, la suppression peux à coups sûr se faire en une seule requête...

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Remplacez votre code par cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE PROCEDURE SP_REC_PURGE
    @p_nb_jour int 
    AS
     BEGIN
     DELETE 
        FROM rec
       WHERE ETAT_REC	= 2
         AND DATE_MODIF	<= getdate() - @p_nb_jour
         AND NOT EXISTS(SELECT * FROM ord_fab O
    			WHERE O.id_rec=rec.ID_REC AND O.vers_rec=rec.VERS_REC)
    END

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    celle ou je plante, a en faite une colonne de plus... mais je ne voi pas en quoi ça pose un probléme
    Ce n'est pas l'origine de votre problème

  7. #7
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    A vrai dire, je n'ai pas d'énorme connaissance en Script
    c'est une usine à gaz que j'ai détérée derriére un probléme...

    l'objectif est de purgé les bases, en ne gardant que 2ans d'archives. *on joue sur les dates*

    je ne comrpend pas ce que sont les commit transaction et rollback transaction , ni à qou ils servent

    Par contre je vien de me rentre compte que mes tables ne sont pas identiques
    celle ou je plante, a en faite une colonne de plus... mais je ne voi pas en quoi ça pose un probléme

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 990
    Billets dans le blog
    6
    Par défaut
    Il faut éviter les imbrications de transaction.. ou bien savoir les gérer. En effet les transactions imbriquées, cela n'existe pas. Il n'y a jamais qu'une seule transaction du fait de la notion d'atomicité des transactions.
    Ce qui fait que si vous envoyez 35 BEGIN TRANSCATION, le premier ROLLBACK annule la transaction. En revanche quand vous envoyez un COMMIT cela décrémente le compteur de transaction de 1 et s'il passe à zéro, la transaction est réellement validée.
    Pour tester ou vous en êtes dans votre empilement, vous pouvez utiliser la variable globale de session @@TRANCOUNT.

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/s...ns-imbriquees/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [SQL] Erreur sur une requête
    Par nani1 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/04/2008, 17h29
  2. Sql serveur 2000: Résultat sur une ligne
    Par gamereplay dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/07/2007, 16h29
  3. [SQL] Erreur sur une requète avec un Like
    Par heruwenli dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/05/2007, 14h29
  4. Pb création instance SQL 2000 + SP3a sur windows 2003 server
    Par luxans dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/03/2006, 17h05

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