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 :

Problème création Stored Procedure


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Problème création Stored Procedure
    Bonjour, je désir créer une procédure stockée, mais quelque chose accroche et ça ne fonctionne pas. Je vous fais la mise en situation, j'ai copié plus bas mon code, et j'ai aussi copié les 2 erreurs que SQL me sort.

    Je tente de faire cela avec SQL Management Studio pour SQL Server 2005

    J'ai 2 tables (qui sont en fait des vues)


    -ADM.VPlans

    Champs : NO_PLAN, titre

    -ADM.VPlans_Secteurs

    Champs : NO_PLAN, Secteur

    « NO_PLAN » contient les mêmes numéros de plans que le champ « NO_PLAN » de ADM.VPlans, de sorte que pour chaque ligne de ADM.VPlans, je peux avoir dans ADM.VPlans_Secteurs n lignes, dépendamment si j'ai 0, 1 ou n « Secteur » différents pour un même NO_PLAN.


    Mon but est d'avoir une table :

    -ADM.VPlans_Complets

    Champs : NO_PLAN, titre, Secteurs

    « Secteurs » doit contenir la list des Secteurs, séparés par des virgules

    Ex : (dsl si ce n'est pas tout à fait clair, mais la page d'édition du message ne prend pas en compte les Tabulations et les suites d'espaces... Vous avez le nom des tables, le nom des champs, et ensuite les données..)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    V3R.ADM.VPlans--|--V3R.ADM.VPlans_Secteur--|--V3R.ADM.VPlans_Complets 
     
     
     NO_PLAN---titre--|--NO_PLAN---Secteur---|--NO_PLAN---titre---Secteurs 
     
    1----------tata---|----1----------TR-----|-----1--------tata----TR,CAP 
    2----------titi---|----1----------CAP----|-----2--------titi------CAP 
    3----------toto---|----2----------CAP----|-----3--------toto-----TR,TRO 
    ------------------|----3----------TR 
    ------------------|----3----------TRO
    Voilà procédure stockée :



    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
    CREATE PROCEDURE dbo.MergeMyTwoTables AS
     
    DELETE * FROM V3R.ADM.VPlans_Complets
     
    DECLARE @NO_PLAN int 
     
    DECLARE @titre varchar(1000) 
     
     
    DECLARE @Concatenated varchar(2000) 
     
     
    DECLARE cursorSourceTable CURSORFORSelect NO_PLAN, titre FROM V3R.ADM.VPlans ORDERBY NO_PLAN ASC 
     
    OPEN cursorSourceTable 
     
     
    FETCH NEXT FROM cursorSourceTable INTO @NO_PLAN, @titre 
     
    WHILE @@FETCH_STATUS <> - 1 BEGIN 
     
     
          --For this line, get all values from sub-lines and concatenate them 
     
          SELECT @Concatenated  =null 
     
          SELECT @Concatenated =coalesce(@Concatenated +', ','')+cast(Secteur asvarchar(40))
          FROM V3R.ADM.VPlans_Secteurs 
          WHERE NO_PLAN = @NO_PLAN 
     
     
     
          --Insert result in ADM.VPlans_Complets 
     
          INSERT INTO V3R.ADM.VPlans_Complets (NO_PLAN, titre, Secteurs)
          VALUES (@NO_PLAN, @titre, coalesce(@Concatenated,'') 
     
     
     
          FETCH NEXTFROM cursorSourceTable INTO @NO_PLAN, @titre 
     
    END 
     
    CLOSE cursorSourceTable 
     
    DEALLOCATE cursorSourceTable 
     
    GO



    Et ensuite, je créerais une Tâche planifiée pour répéter la procédure plusieurs fois par jour avec la commande

    Requête sql pour runner la stored proc:
    Exec MergeMyTwoTables

    Voilà les messages d'erreur que SQL me donne lorsque j'exécute ma procédure. Je ne comprend pas.


    Msg 102, Niveau 15, État 1, Procédure MergeMyTwoTables, Ligne 3

    Syntaxe incorrecte vers '*'.

    Msg 156, Niveau 15, État 1, Procédure MergeMyTwoTables, Ligne 23

    Syntaxe incorrecte vers le mot clé 'FETCH'.

  2. #2
    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
    Bonsoir,

    Plusieur choses :

    - DELETE * FROM ca ne marche pas --> DELETE FROM ma table est plus correct
    - Dans la mesure du possible évitez les curseurs lorsque vous pouvez vous en passez.

    Voici un code qui devrait marcher chez vous (A adapter avec les types de données de vos tables)

    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
     
    CREATE PROCEDURE dbo.MergeMyTwoTables
    AS
     
    DECLARE @titre VARCHAR(50)
    DECLARE @secteurs VARCHAR(1000)
    DECLARE @no_plan_maj INT
     
    -- Suppression enreg 
    DELETE FROM dbo.VPlans_Complets
     
    -- Insertion des no de plan dans une table temporaire
    SELECT no_plan, titre, 0 AS maj INTO #temp
    FROM dbo.VPlans
     
    -- Traitement du champ secteur + insertion dans VPlans_Complets
    WHILE EXISTS(SELECT * FROM #temp WHERE maj = 0)
    BEGIN
     SET @secteurs = NULL
     
     SELECT TOP 1 @no_plan_maj = no_plan, @titre = titre
     FROM #temp
     WHERE maj = 0
     ORDER BY no_plan
     
     SELECT @secteurs = COALESCE(@secteurs + ',','') + s.secteur
     FROM dbo.VPlans p
     INNER JOIN dbo.VPlans_Secteurs s
     ON p.no_plan = s.no_plan
     WHERE p.no_plan = @no_plan_maj
     
     INSERT INTO dbo.VPlans_Complets VALUES(@no_plan_maj,@titre,@secteurs)
     
     UPDATE #temp
     SET maj = 1
     WHERE no_plan = @no_plan_maj
     
    END
     
    -- Suppression table temporaire
    DROP TABLE #temp
    ++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    DELETE * n'existe pas. SELECT * oui. Mais pour DELETE, c'est DELATE MaTable...

    Pour la 2e erreur, votre code étant trèsn mal écrit difficile de dire exactement d'ou elle vien :
    1) on ne colle pas les mots clef, ni les parenthèses
    2) on termine ses phrases SQL par un point virgule.

    Voici votre proc corrigée :

    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
    CREATE PROCEDURE dbo.MergeMyTwoTables
    AS
     
    DELETE FROM V3R.ADM.VPlans_Complets;
     
    DECLARE @NO_PLAN int, @titre varchar(1000) , @Concatenated varchar(2000) 
     
    DECLARE cursorSourceTable CURSOR 
    FOR Select NO_PLAN, titre 
        FROM   V3R.ADM.VPlans 
        ORDER  BY NO_PLAN ASC;
     
    OPEN cursorSourceTable;
     
    FETCH NEXT cursorSourceTable INTO @NO_PLAN, @titre; 
     
    WHILE @@FETCH_STATUS <> - 1 
    BEGIN 
     
          --For this line, get all values from sub-lines and concatenate them 
     
          SELECT @Concatenated = null;
     
          SELECT @Concatenated = coalesce(@Concatenated +', ','') + cast(Secteur asvarchar(40))
          FROM   V3R.ADM.VPlans_Secteurs 
          WHERE  NO_PLAN = @NO_PLAN;
     
     
          --Insert result in ADM.VPlans_Complets 
     
          INSERT INTO V3R.ADM.VPlans_Complets (NO_PLAN, titre, Secteurs);
          VALUES (@NO_PLAN, @titre,coalesce(@Concatenated,''); 
     
     
          FETCH NEXT cursorSourceTable INTO @NO_PLAN, @titre; 
     
    END 
     
    CLOSE cursorSourceTable; 
     
    DEALLOCATE cursorSourceTable; 
     
    GO
    Si cela cloche encore, voyez la ligne d'avant.

    Enfin pour ce qui est de faire cela sans curseur il suffit de la faire la concaténation dans une CTE et insérer le tout en une seule requête SQL.

    Bien évidemment, comme vous n'avez pas respecté la charte de postage difficile de vous en dire plus !

    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/ * * * * *

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/07/2012, 12h16
  2. Réponses: 4
    Dernier message: 13/12/2006, 00h08
  3. [sql 200] Problème avec une stored procedure
    Par marc_dd dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 01/12/2006, 15h11
  4. [QUERY ANALYSER]problème au lancement d'une stored procedure
    Par gregorian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2005, 16h39
  5. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21

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