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 :

Tranformer une chaîne en ensemble


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 412
    Points : 149
    Points
    149
    Par défaut Tranformer une chaîne en ensemble
    Salut,

    dans une procédure stockée je passe en paramètre une liste d'id.
    Je voudrais utiliser cette liste dans une clause where :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER PROCEDURE [dbo].[maproc] 
    	@IDS_INTERV varchar(MAX) = null
    AS
    BEGIN
    	select ...
    	from ...
    	where ...
    	and cast(I.INT_ID as char(36)) in (@IDS_INTERV)
    END
    Ca ne trouve rien, alors que si je mets des valeurs en dur ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	and cast(I.INT_ID as char(36)) in ('cbb22e40-7c71-408f-bc6b-4ec56014868e','988184bb-0de1-47ee-8786-3c68c10656b5')
    Je suppose qu'il s'agit d'un problème d'interprétation du varchar qui n'est pas reconnu comme un ensemble ? Que faut-il faire ?

  2. #2
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    ---------
    A tout hasard j'ai tenté d'ajouter un select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	AND cast(I.INT_ID AS char(36)) IN (select @IDS_INTERV)
    mais ça ne donne rien non plus

    Et si je fais la même chose avec les valeurs en dur ça ne compile même pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND cast(I.INT_ID AS char(36)) IN select ('cbb22e40-7c71-408f-bc6b-4ec56014868e','988184bb-0de1-47ee-8786-3c68c10656b5')
    =>
    ERROR : Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
    Je suis un peu perdu là.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 265
    Points : 314
    Points
    314
    Par défaut
    Effectivement ton varchar n'est pas interprété comme une liste.

    Pour ma part, je gère ce cas de figure avec une fonction qui me renvoie une table:
    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
    ALTER FUNCTION [dbo].[fnParseList]
    (
    	@Text NVARCHAR(MAX),
    	@Delimiter CHAR
    )
    RETURNS @Result TABLE (RowID SMALLINT IDENTITY(1, 1) PRIMARY KEY, Data NVARCHAR(4000))
    AS
     
    BEGIN
    	DECLARE	@NextPos INT,
    		@LastPos INT
     
    	SELECT	@NextPos = CHARINDEX(@Delimiter, @Text, 1),
    		@LastPos = 0
     
     
    	WHILE @NextPos > 0
    		BEGIN
    			INSERT	@Result
    				(
    					Data
    				)
    			SELECT	SUBSTRING(@Text, @LastPos + 1, @NextPos - @LastPos - 1)
     
    			SELECT	@LastPos = @NextPos,
    				@NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1)
    		END
     
    	IF SCOPE_IDENTITY() > 0
    		INSERT	@Result
    			(
    				Data
    			)
    		SELECT	SUBSTRING(@Text, @LastPos + 1, DATALENGTH(@Text) - @LastPos)
    	ELSE
    		INSERT	@Result
    			(
    				Data
    			)
    		SELECT	@Text
     
    	RETURN
    END
    Après tu n'as plus qu'à l'utiliser de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MonChamp IN (SELECT Data FROM dbo.fnParseList(@MaVariableListe,','))
    Petite précision, le code de la fonction ne marche que sur 2005 il me semble. Tu trouveras facilement sur le net le même pour du 2000.

  4. #4
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Wahoo, tout ça pour ça !
    Bon, ben si y'a pas d'autre moyen je vais m'y coller. Merci.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Calcul de l'ensemble des sous-séquences d'une chaîne
    Par Bobez42 dans le forum Débuter
    Réponses: 5
    Dernier message: 11/06/2008, 19h02
  3. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  4. Comptage de mots dans une chaîne
    Par kikinou dans le forum Pascal
    Réponses: 10
    Dernier message: 01/01/2003, 02h27
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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