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 :

Syntaxe procedure stockée


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Points : 44
    Points
    44
    Par défaut Syntaxe procedure stockée
    Bonjour,

    Je début sur SQL-Server et m'arrache les cheveux.

    Voila j'ai développé une base access 2010 que j'ai migré en adp et je suis entrain de reprendre le code pour finaliser cette migration.
    Cette application importe des donnée de différentes sources pour les stocker en base.

    Au cours des importations, je commence par vérifier si de nouvelles valeurs apparaissent afin de les entrer en table "primaire" afin de créer les ids.

    Pour ce faire je pensais utiliser une procédure stocké coté SQL-Server. J'ai donc créé la procédure suivante:

    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
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    ALTER PROCEDURE Verif_ListdansRef 
    	@Table_Imp varchar(50), 
    	@Champ_Imp varchar(50),
    	@Table_ref varchar(50),
    	@Champ_dest varchar(50) = NULL
    AS
    BEGIN
    	DECLARE @Req nvarchar(max)
    	SET NOCOUNT ON
     
    	SET @Req = N'INSERT INTO  @Table_ref (@Champ_dest)
    	    SELECT @Champ_Imp
                FROM (SELECT @Table_Imp.@Champ_Imp
                From  @Table_Imp
                GROUP BY @Table_Imp.@Champ_Imp)  AS Temp LEFT JOIN @Table_ref ON Temp.@Champ_Imp = @Table_ref.@Champ_dest
                WHERE Temp.@Champ_Imp Is Not Null AND @Table_ref.@Champ_dest is not null'
    	EXEC sp_executesql
    		@req
    		,N'@Table_Imp varchar(50),@Champ_Imp varchar(50),@Table_ref varchar(50),@Champ_dest varchar(50)'
    		,@Table_Imp=@Table_Imp
    		,@Champ_Imp=@Champ_Imp
    		,@Table_ref=@Table_ref
    		,@Champ_dest=@Champ_dest
    END
    GO
    Quand je cherche à l'exécuter, par la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    USE [Pilotage CS]
    EXECUTE Verif_ListdansRef 'USysImport_RFC_CCM','Client','T_Client','Nom_client'
    J'obtiens l'erreur suivante:
    Msg*102, Niveau*15, État*1, Ligne*1
    Syntaxe incorrecte vers '@Champ_dest'.
    Msg*102, Niveau*15, État*1, Ligne*3
    Syntaxe incorrecte vers '@Champ_Imp'.

    j'ai beau fouiller je vois pas ce qui lui plait pas.

    Serai-t-il plus simple de construire la requête dans access sous forme de nvarchar et de passer cette variable en paramètre de ma procédure? Dans ce cas comment l'exécuter?

    Cordialement

  2. #2
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    il manque le parametre OUTPUT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    EXEC sp_executesql
    		@req
    		,N'@Table_Imp varchar(50),@Champ_Imp varchar(50),@Table_ref varchar(50),@Champ_dest varchar(50)'
    		,@Table_Imp=@Table_Imp OUTPUT
    		,@Champ_Imp=@Champ_Imp OUTPUT
    		,@Table_ref=@Table_ref OUTPUT
    		,@Champ_dest=@Champ_dest OUTPUT
    J'ai également l'habitude de donner d'autres noms de variables dans le SQL dynamique, genre Table_ImpOut pour éviter de s’emmêler les pinceaux.

    il y a peut être d'autres soucis, mais je ne peux pas tester.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Je viens de modifier mon code afin de prendre en compte ta remarque voici ce que cela donne ( je n'ai pas mis l'OUTPUT car je n'ai pas besoin de récupérer les valeurs en sortie):
    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
    CREATE PROCEDURE Verif_ListdansRef 
    	@Table_Imp varchar(50), 
    	@Champ_Imp varchar(50),
    	@Table_ref varchar(50),
    	@Champ_dest varchar(50) = NULL
    AS
    BEGIN
    	DECLARE @Req nvarchar(max)
    	SET NOCOUNT ON
     
    	SET @Req = N'INSERT INTO  @INt_Table_ref (@INt_Champ_dest)
    		SELECT @INt_Champ_Imp
                FROM (SELECT @INt_Table_Imp.@INt_Champ_Imp
                From  @INt_Table_Imp
                GROUP BY @INt_Table_Imp.@INt_Champ_Imp)  AS Temp LEFT JOIN @INt_Table_ref ON Temp.@INt_Champ_Imp = @INt_Table_ref.@INt_Champ_dest
                WHERE Temp.@INt_Champ_Imp Is Not Null AND @INt_Table_ref.@INt_Champ_dest is not null'
    	EXEC sp_executesql
    		@req
    		,N'@Table_Imp varchar(50),@Champ_Imp varchar(50),@Table_ref varchar(50),@Champ_dest varchar(50)'
    		,@INt_Table_Imp=@Table_Imp
    		,@INt_Champ_Imp=@Champ_Imp
    		,@INt_Table_ref=@Table_ref
    		,@INt_Champ_dest=@Champ_dest
    END
    A l'exécution, je sais maintenant que les variables qui sont cherchées sont:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Msg 1087, Niveau 15, État 2, Ligne 1
    La variable de table "@INt_Table_ref" doit être déclarée.
    Msg 137, Niveau 15, État 2, Ligne 2
    La variable scalaire "@INt_Champ_Imp" doit être déclarée.
    Msg 137, Niveau 15, État 2, Ligne 3
    La variable scalaire "@INt_Table_Imp" doit être déclarée.
    Je comprends pas pour quelles raisons seules ces 3 et pas @INt_Champ_dest.

    Pourrait-on m'expliquer svp

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La méthode que vous utilisez permet de passer des variables en tant que... variables, pas en tant que "bout" de la requete SQL

    Dans votre cas, il faut concaténer la chaine, puis la passer à sp_executesql : SET @Req = N'INSERT INTO ' + @INt_Table_ref + '(' + @INt_Champ_dest + ') '...

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Affectivement Alexandre, le OUPUT n'était pas utile.

    En fait, c'est parce que je ne fais des paramètres que pour OUTPUT.

    Pour le reste, je fais comme l'a indiqué aieeeuuuuu, en concaténant.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Merci pour ces infos.

    Je dois décidément ne pas tout comprendre voici ce que j'ai fais sur vos conseilles (j'ai du loupé un truc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	SET @Req = N'INSERT INTO ' + @Table_ref + '(' + @Champ_dest + ')
    		SELECT ' + @Champ_Imp + '
                FROM (SELECT ' + @Table_Imp + '.' + @Champ_Imp + '
                From ' + @Table_Imp + '
                GROUP BY ' + @Table_Imp + '.' + @Champ_Imp +') AS Temp LEFT JOIN ' + @Table_ref + ' ON Temp.' + @Champ_Imp + ' = ' + @Table_ref + '.' + @Champ_dest + '
                WHERE Temp.' + @Champ_Imp + ' Is Not Null AND ' + @Table_ref + '.' + @Champ_dest + ' is null'
     
    	EXEC sp_executesql
    		@req
    		,N'@Table_Imp varchar(50),@Champ_Imp varchar(50),@Table_ref varchar(50),@Champ_dest varchar(50)'
    		,@Table_Imp=@Table_Imp
    		,@Champ_Imp=@Champ_Imp
    		,@Table_ref=@Table_ref
    		,@Champ_dest=@Champ_dest
    Quand j’exécute sp_executesql le débogueur ouvre une fenêtre (Transact-SQL dynamique) le processeur monte en flèche et je suis obligé de l'arrêter. A l'arrêt, j'ai le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object reference not set to an instance of an object
    J'ai essaye avec seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXEC sp_executesql
    		@req
    Pareil voir impossible d'arrêter le débogueur

    Si je fais juste:
    il me dit que le contenu de @Req n'est pas un identifieur valide

    Si je fais:
    J'ai la même fenêtre bloqué mais qui veut bien se fermer et me rendre la main. En revanche, la requête s'est bien exécutée car les nouvelles données ont été insérées.

    Je sens que je suis pas loin de la solution. Je rame mais n'avance pas.

    Merci pour votre aide.

  7. #7
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    là, ça va devenir compliqué pour nous de t'aider : nous ne connaissons pas la structure des tes données, ni le nombre d'enregistrements mis en jeu.

    Remplace le exec @sql par un print @sql et lance la requête à la main pour voir ce que ça donne.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    quand j’exécute la requête à la main sans le insert cela me retourne 2-3 enrg 10 max
    Si je l'exécute avec le insert les données sont bien saisie dans la table de destination.

    Le principe est, je pense simple, les données brutes sont stockées dans une table temporaire. Le champ qui contient les données unitaires est isolé pour ne récupérer que les nouvelles donnée unitaire et je les inscris dans la table sources.

    C'est pourquoi la requête ne contient que très peux d'enregistrement

    Encore merci, si vous avez des liens que je n'aurai pas encore exploré sur les différentes méthodes pour exécuter une requête dans une procédure stockée ou fonction je suis preneur pour tester.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 17h48
  2. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 14h17
  3. Réponses: 2
    Dernier message: 29/09/2002, 11h25
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 11h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 13h27

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