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 :

Variable varchar contenant des id (3,4,5) avec un IN


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 176
    Par défaut Variable varchar contenant des id (3,4,5) avec un IN
    Bonjour,

    Dans une procédure stockée, je reçois une variable varchar qui contient une suite d’ID sous cette forme 3,4,5,6

    Je voudrais trouver toutes les enregistrements avec ces ID.

    J’ai fait comme ça : (il y a pas une méthode plus correcte ?)

    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
    ALTER PROCEDURE [dbo].[GestionRetourMaterielEtat]
    	-- Add the parameters for the stored procedure here
    	@PIDDossierTab varchar(300)
     
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
        DECLARE @sql AS VARCHAR(255)
     
        SET @sql = 'SELECT  
        Saturna.dbo.dossier.NumDossier
        FROM Saturna.dbo.dossier 
        LEFT JOIN Saturna.dbo.Client_Dossier ON Saturna.dbo.Client_Dossier.IDdossier  = Saturna.dbo.dossier.IDdossier 
        LEFT JOIN Saturna.dbo.Adresse_Dossier ON Saturna.dbo.Adresse_Dossier.IDdossier = Saturna.dbo.dossier.IDdossier 
        WHERE Saturna.dbo.dossier.IDdossier IN (' + @PIDDossierTab + ')'
     
    	EXECUTE (@sql);
    Quand j’exécute, j’obtiens une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg 4145, Level 15, State 1, Line 5
    An expression of non-boolean type specified in a context where a condition is expected, near 'Adres'.
     
    (1 row(s) affected)
    Je me suis basé sur ce post pour le requête : http://forums.whirlpool.net.au/archive/928435



    Maintenant, si je retire un des deux LEFT JOIN, j’obtiens bien mes résultats.
    Une idée ?

    D’avance, merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 176
    Par défaut
    Bon, je retourne dormir...

    DECLARE @sql AS VARCHAR(255)

    C'était simplement trop petit pour la taille de la query...

    N'empêche, il n'y a pas une meilleur méthode ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ce n'est pas faux mais elle a de gros défauts, dont le SQL Injection et la multiplication des plans d'exécutions.

    Si vous lisez l'anglais, j'ai trouvé ce lien qui recense de nombreuses méthodes (lien que j'ai simplement survolé) :
    http://www.sommarskog.se/arrays-in-sql-2005.html

  4. #4
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Tu peux faire un split des valeurs sur ton séparateur ","

    ensuite insérer dans une table temporaire ou dans une table fixe puis faire un select exists des éléments de ta table.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Pour le dépouillement de la chaîne, vous pouvez voir le billet que j'ai publié à ce sujet.

    Privilégiez l'utilisation de sp_executesql, qui permet de paramétrer les requêtes et donc de réutiliser les plans de requêtes, donc :

    - de diminuer le temps de requête en évitant la compilation
    - de ne pas pourrir le cache de plans avec des plans qui ont une forte probabilité de ne jamais être réutilisés ...

    J'ai donné des exemples d'utilisation de sp_executesql ici

    @++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 176
    Par défaut
    Merci pour votre retour.

    Je vais travailler avec sp_executesql.

    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
    ALTER PROCEDURE [dbo].[GestionRetourMaterielEtat]
    	-- Add the parameters for the stored procedure here
    	@PIDDossierTab varchar(300)
     
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
    	DECLARE @SQLString NVARCHAR(500)
    	DECLARE @ParmDefinition NVARCHAR(500)
     
    	DECLARE @IntVariable INT
    	DECLARE @Lastlname varchar(50)
     
    	SET @SQLString = N'SELECT @LastlnameOUT = saturna.dbo.dossier.Responsable
                       FROM saturna.dbo.dossier
                       WHERE saturna.dbo.dossier.IDdossier IN ('+@PIDDossierTab+')'
     
    	SET @ParmDefinition = N'@LastlnameOUT varchar(50) OUTPUT'
     
    	EXECUTE sp_executesql
    		@SQLString,
    		@ParmDefinition,
    		@LastlnameOUT=@Lastlname OUTPUT
     
    	SELECT @Lastlname
     
    END
    Par contre, je vais devoir stocker les résultats dans une table temporaire avant de faire un SELECT sur cette table.

    Bon, je sais que ce n'est pas top...

    http://blog.developpez.com/elsuket/p...e-performance/

    Mais je ne vois pas comment faire autrement surtout avec mes connaissances.

    J'ai lu le billet sur le dépouillement mais ça ne fait pas tilt.

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

Discussions similaires

  1. [Batch] Variable texte contenant des mots réservés
    Par canorra dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 10/09/2012, 16h02
  2. Réponses: 1
    Dernier message: 28/12/2011, 18h34
  3. Réponses: 7
    Dernier message: 06/01/2010, 08h32
  4. [MySQL] Classé un champ varchar, contenant des dates
    Par gastoncs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/09/2009, 01h04
  5. Tri varchar contenant des nombres et des lettres
    Par ben106 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/08/2007, 21h58

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