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 :

est-il possible de faire un where avec une liste en paramètre


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 14
    Points
    14
    Par défaut est-il possible de faire un where avec une liste en paramètre
    Bonjour,
    est-ce qu'il est possible de faire une requête (procédure stockée) avec comme paramètre une liste de données ?
    je m'explique :
    je veux envoyer une liste [a,b,c,d] a une procédure
    et je veux faire une recherche avec ca, dire au système si mon ID existe dans [a,b,c,d]

    select * from MaTable where ID exist dans [a,b,c,d]

    je precise que je travail sur sql server 2005

    merci par avance

  2. #2
    Membre confirmé Avatar de tumoo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 309
    Points : 522
    Points
    522
    Par défaut
    Salut

    Oui tu peux avec le mot clé IN

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from MaTable where ID IN (a,b,c,d)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    non ca passe pas



    Citation Envoyé par tumoo Voir le message
    Salut

    Oui tu peux avec le mot clé IN

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from MaTable where ID IN (a,b,c,d)

  4. #4
    Membre confirmé Avatar de tumoo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 309
    Points : 522
    Points
    522
    Par défaut
    Bah tu déclares 4 paramètres dans ta procédure,

    et tu fais un

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE ID IN (@param1,@param2,@param3,@param4)

    dans ta procédure

    Pour l'appel,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    exec ta_procédure @param1=a,@param2=b,@param3=c,@param4=d

    Tu saisis le principe ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    oui mais non lol
    en fait y aura presque entre 1 et 2000 paramètres ca dépends des cases que l'utilisateur a coché dans un treeview (c#)



    Citation Envoyé par tumoo Voir le message
    Bah tu déclares 4 paramètres dans ta procédure,

    et tu fais un

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE ID IN (@param1,@param2,@param3,@param4)

    dans ta procédure

    Pour l'appel,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    exec ta_procédure @param1=a,@param2=b,@param3=c,@param4=d

    Tu saisis le principe ?

  6. #6
    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,

    C'est un problème récurrent et il existe trois façons de le résoudre :

    - soit vous faites un INSERT dans une table à deux colonnes, réservée à cet effet : l'une est un identifiant de type uniqueidentifier, généré par la procédure stockée avec la fonction NEWSEQUENTIALID(), et vous stockez toutes les valeurs dans cette colonne.
    Ensuite vous faites la jointure sur cette table en filtrant par l'identifiant

    - soit vous utilisez des paramètres de type TABLE (TVP dans la littérature), qui sont plus stricts.
    Mais comme ce sont des variables de type TABLE côté SQL Server, aucune statistique n'est maintenue sur une telle table (elle est stockée dans TempDB).
    Donc l'estimation de cardinalité pour un grand nombre de valeurs est souvent faux à moins que vous terminiez la requête par OPTION (RECOMPILE).
    Dans ce dernier cas, si la requête est exécutée très fréquemment, vous allez augmenter la consommation de CPU.

    - Soit vous utilisez une fonction SQL de dépouillement de la chaîne, et vous faites une jointure sur la fonction table.
    Vous aurez le même problème d'estimation de cardinalité que ci-dessus.

    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
    CREATE TABLE dbo.nombre
    (
    	nombre int NOT NULL CONSTRAINT PK_Nombres PRIMARY KEY CLUSTERED
    )
     
    SET NOCOUNT ON
     
    DECLARE	 @max AS INT,
    	@i AS INT
     
    SELECT @max = 100000;
    	, @i = 1;
     
    WHILE @i<= @max
    BEGIN
    	INSERT dbo.nombre SELECT @i
    	SET @i += 1
    END
     
    CREATE FUNCTION dbo.SplitStringToInt
    	(
    		@string AS VARCHAR(max)
    	)
    RETURNS TABLE
    AS
    	RETURN
    		SELECT	CAST(SUBSTRING(@string, nombre, CHARINDEX(',', @string + ',', nombre) - nombre) AS int) AS element
    		FROM	dbo.nombre
    		WHERE	nombre<= LEN(@string) + 1
    		AND	SUBSTRING(',' + @string, nombre, 1) = ','
    GO
    @++

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    supeeeer merci Nicolas pour toutes ses explications



    Citation Envoyé par elsuket Voir le message
    Bonjour,

    C'est un problème récurrent et il existe trois façons de le résoudre :

    - soit vous faites un INSERT dans une table à deux colonnes, réservée à cet effet : l'une est un identifiant de type uniqueidentifier, généré par la procédure stockée avec la fonction NEWSEQUENTIALID(), et vous stockez toutes les valeurs dans cette colonne.
    Ensuite vous faites la jointure sur cette table en filtrant par l'identifiant

    - soit vous utilisez des paramètres de type TABLE (TVP dans la littérature), qui sont plus stricts.
    Mais comme ce sont des variables de type TABLE côté SQL Server, aucune statistique n'est maintenue sur une telle table (elle est stockée dans TempDB).
    Donc l'estimation de cardinalité pour un grand nombre de valeurs est souvent faux à moins que vous terminiez la requête par OPTION (RECOMPILE).
    Dans ce dernier cas, si la requête est exécutée très fréquemment, vous allez augmenter la consommation de CPU.

    - Soit vous utilisez une fonction SQL de dépouillement de la chaîne, et vous faites une jointure sur la fonction table.
    Vous aurez le même problème d'estimation de cardinalité que ci-dessus.

    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
    CREATE TABLE dbo.nombre
    (
    	nombre int NOT NULL CONSTRAINT PK_Nombres PRIMARY KEY CLUSTERED
    )
     
    SET NOCOUNT ON
     
    DECLARE	 @max AS INT,
    	@i AS INT
     
    SELECT @max = 100000;
    	, @i = 1;
     
    WHILE @i<= @max
    BEGIN
    	INSERT dbo.nombre SELECT @i
    	SET @i += 1
    END
     
    CREATE FUNCTION dbo.SplitStringToInt
    	(
    		@string AS VARCHAR(max)
    	)
    RETURNS TABLE
    AS
    	RETURN
    		SELECT	CAST(SUBSTRING(@string, nombre, CHARINDEX(',', @string + ',', nombre) - nombre) AS int) AS element
    		FROM	dbo.nombre
    		WHERE	nombre<= LEN(@string) + 1
    		AND	SUBSTRING(',' + @string, nombre, 1) = ','
    GO
    @++

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    A nico:

    je precise que je travail sur sql server 2005
    vous devez donc ignorer les TVP.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Est-il possible de faire un Wiki avec XMLRad?
    Par thierryc dans le forum XMLRAD
    Réponses: 1
    Dernier message: 01/12/2009, 22h39
  2. Réponses: 1
    Dernier message: 25/03/2009, 11h07
  3. Réponses: 4
    Dernier message: 24/10/2007, 14h57
  4. Est il possible de faire un cursor sur une procédure stocké ?
    Par berceker united dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/09/2007, 16h47
  5. Réponses: 23
    Dernier message: 08/06/2006, 15h06

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