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 :

Envoyer un VARCHAR pour un WHERE IN au format INT [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Envoyer un VARCHAR pour un WHERE IN au format INT
    Bonjour

    Je viens vers car je suis confronté à un souci qui dépasse mes compétences. J'ai fais une fonction table donc voici le 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
     
    ALTER FUNCTION [dbo].[Draft_Par_Competition]
    (	
    	@id_Competition AS VARCHAR(100)
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
    SELECT D.* FROM dbo.Compétitions AS C 
    INNER JOIN dbo.Matchs AS M ON M.Compétition = C.id_Competition 
    INNER JOIN dbo.Games AS G ON G.Match_Id = M.id_Match 
    INNER JOIN dbo.Draft AS D ON D.Game_Id = G.id_Game 
    WHERE C.id_Competition IN (@id_Competition)
    )
    A la base mon paramètre était au format INT puisque je n'avais pas prévu d'interroger mes donnée pour plusieurs compétitions en même temps et donc ma clause WHERE était avec un = et pas un IN.
    Mais il se trouve que mon besoins a évolué et qu'il faut que je puisse envoyer plusieurs identifiants de compétition pour avoir des données cumulées. Sauf que je ne sais pas comment faire.

    Pourriez vous m'aider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    On peut détourner l'utilisation des méthodes XQuery pour ce faire :

    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
    CREATE FUNCTION maFonction
    	(
    		@_competition_id_list varchar(max)
    	)
    RETURNS TABLE
    AS
    RETURN
    (
    	SELECT		D.*
    	FROM		dbo.Compétitions AS C
    	INNER JOIN	dbo.Matchs AS M ON M.Compétition = C.id_Competition 
    	INNER JOIN	dbo.Games AS G ON G.Match_Id = M.id_Match 
    	INNER JOIN	dbo.Draft AS D ON D.Game_Id = G.id_Game 
    	INNER JOIN	(
    				SELECT		N.n.value('.', 'int')
    				FROM		(VALUES(CAST('<v>' + REPLACE(@_competition_id_list, ',', '</v><v>') + '</v>' AS xml))) AS V(v)
    				CROSS APPLY	V.v.nodes('/v') AS N(n)
    			) AS T(id_competition) 	ON T.id_competition = C.id_Competition
    )
    GO
    Alternative : vous pouvez créer un type TABLE, et l'utiliser pour le passer en paramètre à la fonction (table-valued parameter dans la littérature) :

    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
    CREATE TYPE monType
    AS TABLE (id_competition int)
    GO
     
    CREATE FUNCTION maFonction
    	(
    		@_competition_id_table dbo.monType READONLY
    	)
    RETURNS TABLE
    AS
    RETURN
    (
    	SELECT		D.*
    	FROM		dbo.Compétitions AS C
    	INNER JOIN	dbo.Matchs AS M ON M.Compétition = C.id_Competition 
    	INNER JOIN	dbo.Games AS G ON G.Match_Id = M.id_Match 
    	INNER JOIN	dbo.Draft AS D ON D.Game_Id = G.id_Game 
    	INNER JOIN	@_competition_id_table AS T ON T.id_competition = C.id_Competition
    )
    @++

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci beaucoup, c'est vraiment génial.
    Non seulement ça marche super bien mais j'ai réussi à l'adapter à un autre cas similaire

    Un très bonne journée à toi.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Avec plaisir

    @++

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

Discussions similaires

  1. [MySQL] implode pour clause where champ in (varchar)
    Par ldiaz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/05/2012, 19h26
  2. envoyer un message pour autre ordinateur avec dos
    Par zidenne dans le forum Développement
    Réponses: 11
    Dernier message: 09/09/2006, 18h44
  3. taille des varchars pour utf8
    Par myheqa dans le forum Installation
    Réponses: 10
    Dernier message: 21/05/2006, 23h52
  4. Réponses: 4
    Dernier message: 27/03/2006, 16h06
  5. Envoyer un fichier pour le faxer...
    Par Sunchaser dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/07/2005, 00h12

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