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 :

SQl server 2000 Procédure stockée


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut SQl server 2000 Procédure stockée
    Bonjour,

    Dans une procédure stockée j'utilise 2 curseurs.

    Lorsque dans une vue créée dans le deuxième j'appelle des variables définies dans le 1er un message d'erreur me demande de les déclarer alors quelles le sont bien au début de la procédure.

    En revanche lorsque dans le 2èm curseur j'affiche une variable, cela marche bien!!!

    voici le code:


    CREATE PROCEDURE [test] AS

    DECLARE @agent varchar(20)
    DECLARE @equipe varchar(20)
    DECLARE @date varchar(20)
    DECLARE @machine varchar(20)


    DECLARE curseur1 CURSOR FOR
    SELECT DISTINCT agent, equipe,left(dateheure, 8) FROM tracabilite WHERE codescan like 'FP%'

    OPEN curseur1
    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH curseur1 INTO @agent,@equipe,@date
    CLOSE curseur1
    DECLARE curseur2 CURSOR FOR
    SELECT DISTINCT right(codescan,3) FROM tracabilite WHERE Agent = @agent and Equipe = @equipe and left(dateheure,8) like @date and right(codescan,3) NOT LIKE 'PP%' and right(codescan,3) NOT LIKE 'FP%'
    OPEN curseur2
    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH curseur2 INTO @machine

    IF exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[essai]') and OBJECTPROPERTY(id, N'IsView') = 1)
    DROP VIEW [dbo].[essai]
    PRINT@agent
    EXEC ('CREATE VIEW essai AS SELECT * FROM tracabilite where equipe = @equipe and agent = @agent and dateheure = @date and right(codescan,3) like @machine ')

    END
    CLOSE curseur2

    END
    GO


    Merci d'avance pour votre aide!!!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    Le SQL dynamique s'exécute en dehors de tout contexte. Donc les variables ne sont pas connues dans votre ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC ('CREATE VIEW essai AS SELECT * FROM tracabilite where equipe = @equipe and agent = @agent and dateheure = @date and right(codescan,3) like @machine ')
    Tout simplement parce que vous ne les avez pas déclaré dans la chaine de caractères....

    Maintenant si vous voulez transmettre des paramètres entre une procédure codée en dur et un code codé en dynamique, il faut passer les valeurs explicitement sous forme de chaînes de caractères....

    Mais je ne comprends pas du tout l'intérêt de votre code....

    A +

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Merci pour la réponse!!

    En fait le travail que je dois réaliser à terme consiste à mettre a jour une table bilan en reprenant les lignes d'une autre table où les évenements (ligne arrivent en pagaille) (table brute).

    Chaque évenement (ligne) est identifié par l'action, le numéro de machine, l'agent, l'équipe, la date, etc... et la table bilan doit synthétiser les évenements par machine, agent, equipe, date; soit faire le bilan de plusieurs lignes de la table brute et de compter le nombre de ligne par évenement.

    Du style:

    Table brute (tracabilite2):

    |agent|equipe| date |machine|évenement
    04 A 20080331 01 coup
    02 B 20080331 06 poinc
    04 A 20080331 01 tran
    04 A 20080331 01 coup
    04 A 20080331 01 tran
    02 B 20080331 06 poinc
    04 A 20080331 01 coup

    Table bilan:

    |machine|agent|equipe| date |coup|poinc|tran|
    01 04 A 20080331 3 0 2
    06 02 A 20000331 0 2 0
    ...


    Enfin voila le principe j'espere que c'est plus clair!!

    Je veux actualiser la table bilan a chaque fin d'equipe donc c'est pourquoi je programme dans une procédure stockée.

    Dans un 1er temps j'extrais les ligne pour lesquelles il y a bien une fin de production. (Les autres lignes seront extraites a la fin de l'équipe suivante)
    Le 1er curseur stocke la valeur des agents, equipes et dates pour ensuite refaire une requète permettant d'extraire que les machines utilisées par cette production! le 2èm curseur permet de stocker le numéro des différentes machines.

    Ensuite ayant toutes les variables necessaire je voudrais extraire toutes les lignes a la mail machine agent equipe.

    Voila j'espere avoir été clair dans mes explications. Je suis pas programmeur donc ceci explique cela....

    Merci pour votre aide!

  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 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    Une seule requête SQL suffit !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT machine, agent, equipe, date,
           SUM(CASE évenement WHEN 'coup' THEN 1 END) AS coup,
           SUM(CASE évenement WHEN 'poinc' THEN 1 END) AS poinc,
           SUM(CASE évenement WHEN 'tran' THEN 1 END) AS tran
    FROM   MaTable
    GROUP  BY machine, agent, equipe, date
    Bref, apprenez le langage SQL au lieu de faire des trucs imbitables et catastrophiquement lent.
    Mon site web, comme mes bouquins peuvent vous y aider !

    A +

Discussions similaires

  1. [SQL SERVER][WinDEV] Procédure stockée
    Par diniin dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/04/2009, 20h30
  2. [SQL Server 2005] Procédure stockée dynamique ?
    Par nitrous007 dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 20/12/2006, 13h54
  3. [sql server 2000] Procédure stockée ~ Récursif (débutant)
    Par Sadneth dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/02/2006, 11h16
  4. [SQL SERVER 2000] Procédure RENAME?
    Par Tankian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/08/2004, 15h39

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