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

  1. #1
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    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
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    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 858
    Points : 52 999
    Points
    52 999
    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 +

  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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    De plus votre curseur est complètement inutile, la suppression peux à coups sûr se faire en une seule requête...

  6. #6
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    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

  7. #7
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    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

  8. #8
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    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

  9. #9
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    OK,
    j'essaye le code que vous m'avez donné. je vous tien au courant *rapidement*

  10. #10
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Une petite erreur s'est introduite dans mon script :-) je l'ai modifié

  11. #11
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    dans ce code
    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 R.ETAT_REC	= 2
         AND R.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
    il ne prend pas le code....
    il me génére une erreur lorsque je check la syntax
    Error 107:
    The column prefix 'R' does not match with a table name or alias name used in the query.
    PS: ton premier code fonctionné au niveau syntax mais toujours une erreur avec mon job ..

  12. #12
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    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

    Retirez simplement les deux "R." de la clause where

  13. #13
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    PS: ton premier code fonctionné au niveau syntax mais toujours une erreur avec mon job ..
    Heureusement... grâce aux contraintes...

  14. #14
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    ok c'est bon le scritp est correct sytaxiquement et le job tourne
    mais quelles sont les différences par rapport a mon code d'origine?...

    je voudrai justifier ce travaille, bien que je comprenne les requétes SQL faite.

  15. #15
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Ok...
    L'ancien code commençait par lister les lignes à supprimer.
    Puis via un CURSOR (à éviter autant que faire se peut...) pour chacune de ces lignes il vérifiait que la ligne n'était pas "utilisée" par une autre table (ord_fab)
    Si ce n'était pas le cas la ligne était supprimée...

    Du coups si tu as 1000 ligne à supprimer... ton ancien code faisait 2000 requetes...

    SQL permet de faire tout celà en une seule fois car c'est un langage ensembliste...

    Mon nouveau code peux se traduire comme celà:

    "Supprime toutes les lignes vieille de plus de N jours et dont il n'existe pas de lien avec la table ord_fab"...

  16. #16
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    juste une chose que je n'ai pas compris dans le script

    quand tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ord_fab O WHERE O.id_rec=rec.ID_REC AND O.vers_rec=rec.VERS_REC
    pourquoi tu fait O.id_rec?
    le "FROM ord_fab O" donne tout la structure à O de la table ord_fab?

  17. #17
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Le O est juste un alias cela t'evite juste de devoir retaper le nom de ta table en entier à chaque fois...

    Sinon j'aurais du taper çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ord_fab WHERE ord_fab.id_rec=rec.ID_REC AND ord_fab.vers_rec=rec.VERS_REC

  18. #18
    Membre expérimenté 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
    Points : 1 455
    Points
    1 455
    Par défaut
    Merci beaucoup "iberserk"
    *vraiment merci, ça fonctionne nikel*

+ 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