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 :

Passage d'un paramètre avec quote pour une procédure dynamique


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 57
    Points
    57
    Par défaut Passage d'un paramètre avec quote pour une procédure dynamique
    Bonjour,
    je souhaite construire une procédure stockée dynamique qui va me retourner une liste d'utilisateurs lors d'une recherche. Je construis la procédure de manière dynamique car on ne sait pas à l'avance combien de champs de recherche seront renseignés à l'appel de la procédure. Pour infos, les champs possibles sont Nom, Prenom, Academie et Structure. La recherche s'effectue toujours sur l'ensemble des champs renseignés avec comme opérande ET.
    Voici mon code
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    GO
    /*
    	DESCRIPTION	
    		Récupère la liste des utilisateurs d'une recherche
     
    	PARAMETRES en Entrée:
    		- @LastName le nom de famille de l'utilisateur.
    		- @FirstName le prénom de l'utilisateur.
    		- @Structure la structure à laquelle appartient l'utilisateur.
    		- @Academy l'académie de l'utilisateur.
     
     
    */
     
    ALTER PROCEDURE SPR_List_Search_Users
    	@LastName			nvarchar(50),
    	@FirstName			nvarchar(50),
    	@Structure			nvarchar(50),
    	@Academy			nvarchar(50)
    AS
     
    BEGIN
    DECLARE
    	@Select nvarchar(100),
    	@From nvarchar(20),
    	@Where nvarchar(max),
    	@Param nvarchar(max),
    	@ParamNom nvarchar(50),
    	@ParamPrenom nvarchar(50),
    	@ParamStructure nvarchar(50),
    	@ParamAcademy nvarchar(50),	
    	@cmd nvarchar(max)
     
    	SET @ParamNom = ''
    	SET @ParamPrenom = ''
    	SET @ParamStructure = ''
    	SET @ParamAcademy = ''
    	SET @Select = 'SELECT 
    			UserId ,
    			Nom ,
    			Prenom ,
    			Email '
    			-- TODO : rajouter la colonne structure
    			--,Structure 'Structure'
    	print 'SELECT = ' + @Select
    	SET @From = ' FROM
    		dbo.Users '
    	print 'FROM = ' + @From	
    		--Condition toujours vraie
    		--nécessaire pour l'ajout des autres conditions 
    	SET @Where = ' WHERE 1=1 '
    	print 'WHERE 1 = ' +@Where
    	IF  @LastName is not null
    	BEGIN
    		SET @Where = @Where + ' AND Nom = @LastName '
    		print 'WHERE NOM = ' + @Where
    		SET @ParamNom = 'SET @LastName = ' +  @LastName + ' '
    		print 'NOM = ' + @ParamNom
    	END
    	IF @FirstName is not null
    	BEGIN
    		SET @Where = @Where + ' AND Prenom = @FirstName '
    		print 'WHERE PRENOM = ' + @Where
    		SET @ParamPrenom = 'SET @FirstName = ' +  @FirstName + ' '
    		print 'PRENOM = ' + @ParamPrenom
    	END
    	--TODO : prendre en compte les 2 colonnes à rajouter dans la table
    	--IF @Structure <> null
    	--BEGIN
    	--	SET @Where = @Where + ' AND Structure = @Structure '
    	--  print 'WHERE STRUCTURE = ' + @Where
    	--	SET @ParamStructure = 'SET @ParamStructure = ' + N'@Structure' + ' '
    	--	print 'STRUCTURE = ' + @ParamStructure
    	--END
    	--IF @Academy <> null
    	--BEGIN
    	--	SET @Where = @Where + ' AND Academy = @Academy '
    	--  print 'WHERE ACADEMY = ' + @Where
    	--	SET @ParamAcademy = 'SET @ParamAcademy = ' + N'@Academy' + ' '
    	--	print 'ACADEMY = ' + @ParamAcademy
    	--END
     
    	SET @Param = ' DECLARE @LastName nvarchar(50),
    						  @FirstName nvarchar(50),
    						  @Structure nvarchar(50),
    						  @Academy nvarchar(50) '
    	print 'PARAM = ' + @Param				  
    	--' @LastName = ' + @LastName + ' ,@FirstName = ' + @FirstName + ' ,@Structure = ' + @Structure + ',@Academy = ' + @Academy
    	SET @Param = @Param + @ParamNom + @ParamPrenom + @ParamStructure + @ParamAcademy 
    	print 'PARAM FIN = ' + @Param
    	SET @cmd = @Param +@Select + @From + @Where
    	print 'CMD = ' + @cmd
    	exec @cmd
    END
    GO
    Mon problème concernant les clauses WHERE, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    IF  @LastName is not null
    	BEGIN
    		SET @Where = @Where + ' AND Nom = @LastName '
    		print 'WHERE NOM = ' + @Where
    		SET @ParamNom = 'SET @LastName = ' +  @LastName + ' '
    		print 'NOM = ' + @ParamNom
    	END
    @LastName est bien remplacé par la valeur du champ correspondant, comme Dupont par exemple. Le problème, c'est que je voudrais plutot avoir 'Dupont' comme valeur. Comment rajouter les quotes?

    Merci d'avance de votre aide.

  2. #2
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Pour faire apparaître l'apostrophe en tant que caractère, il faut le doubler :

    Essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @WHERE = @WHERE + ' AND Nom =  ''' + @LastName + '''
    ++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 57
    Points
    57
    Par défaut
    cela fonctionne ainsi, je te remercie.

    Cependant, je rencontre un autre problème.
    Lorsque j'exécute ma procédure, j'ai l'erreur suivant

    Msg 203, Level 16, State 2, Procedure SPR_List_Search_Users, Line 92
    Le nom ' DECLARE @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @Structure nvarchar(50),
    @Academy nvarchar(50) SET @LastName = 'admin' SELECT
    UserId ,
    Nom ,
    Prenom ,
    Email FROM
    dbo.Users WHERE 1=1 AND Nom = @LastName ' n'est pas un identificateur valide.
    Je ne vois pas d'où cela vient. En effet, si j'exécute la procédure créée dynamiquement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECLARE @LastName nvarchar(50),
    						  @FirstName nvarchar(50),
    						  @Structure nvarchar(50),
    						  @Academy nvarchar(50) SET @LastName = 'admin' SELECT 
    			UserId ,
    			Nom ,
    			Prenom ,
    			Email  FROM
    		dbo.Users  WHERE 1=1  AND Nom = @LastName
    j'obtiens le bon résultat...

    Je ne vois donc pas trop où est mon erreur puisque ma procédure crée un requete valable et exécutable...

  4. #4
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    En regardant votre procédure dans votre post du début je vois ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @WHERE = @WHERE + ' AND Nom = @LastName '
    Je pense que vous avez oublié d'extraire la variable @LastName. Dans votre cas la variable est considérée comme une chaîne de caractère ...

    En essayant ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @WHERE = @WHERE + ' AND Nom = ''' + @LastName + '''
    Pourquoi un WHERE 1=1 dans votre code ?

    ++

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Je n'utiliserais pas un query dynamique pour ça, à ta place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT
    ...
    WHERE (@firstname IS NULL OR <xxx> = @firstname)
    AND (@lastname IS NULL OR <xxx> = @lastname)
    ...
    À toi te voir.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Pourquoi un WHERE 1=1 dans votre code ?

    ++
    C'est une manière de garantir que l'élément syntaxique "WHERE" apparaîtra dans le query.

  7. #7
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    C'est une manière de garantir que l'élément syntaxique "WHERE" apparaîtra dans le query.
    Oui effectivement en relisant le code ca parait logique

    Je préfére également la solution de Sergejack pour votre problème.

    ++

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 57
    Points
    57
    Par défaut
    Merci pour vos réponse. J'ai finalement utilisé la solution proposée par Sergejack, qui est plus simple que de passer par une query dynamique.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/04/2009, 15h09
  2. Réponses: 4
    Dernier message: 07/01/2009, 23h46
  3. Réponses: 6
    Dernier message: 03/05/2007, 11h28
  4. Count de variable avec separateur pour une meme ligne
    Par snanot dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/02/2007, 17h11
  5. Réponses: 2
    Dernier message: 03/12/2006, 12h37

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