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 :

Tableau de variables dans une procédure stockée ?


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut Tableau de variables dans une procédure stockée ?
    Bonjour,

    Je suis débutant en et j'aimerai savoir si il est possible de déclarer des tableaux de variable dans des procédures stockées sous SQL SERVER 2000

    J'aimerais pouvoir réaliser quelque chose qui puisse ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare @MonTableau
     
    set @MonTableau = array('A152', 'B300', 'C420', 'D123')
     
    SELECT * FROM MaTable WHERE Code IN @MonTableau
    Est ce possible ?

    Merci
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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,

    Non ce n'est pas possible.
    On ne peut pas programmer en SQL comme on programme dans les autres langages, même s'il est vrai qu'en SQL Server 2008 on peut passer une variable de type table à une procédure stockée.

    Qu'est-ce qui ne vas pas dans cette réponse ?

    Vous pouvez aussi faire ça si vous faites des scripts de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH
    	CTE_VALEURS (valeur)AS
    	(
    		SELECT 'A152'
    		UNION SELECT 'B300'
    		UNION SELECT 'C420'
    		UNION SELECT 'D123'
    	)
    SELECT *
    FROM dbo.MaTable T
    JOIN CTE_VALEURS V ON T.Code = V.valeur
    @++

  3. #3
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Wow

    En fait c'est un peut plus compliqué que cela car ma requête contient 2 clauses IN dans mon WHERE avec un OR pour l'un d'entre eux, ce qui semble a mon avis impossible avec votre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM MaTable 
    WHERE Code1 IN @MonTableau1 AND ((Code2 IN @MonTableau2) OR (@MaVariable=1))
    ça me permet de prendre en compte uniquement la 1ere condition dans certains cas particuliers

    Sinon pour faire très simple, est il possible au lieu de faire une variable tableau, de faire une variable varchar qui contient le texte du IN prés formaté ? ça me conviendrait tout à fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    declare @MesVal1 varchar(100)
    set @MesVal1  = '(''A123'',''B654'',''C657'')'
     
    declare @MesVal2 varchar(100)
    set @MesVal2  = '(''C123'',''D654'',''E657'')'
     
    SELECT * 
    FROM MaTable 
    WHERE Code1 IN @MesVal1 AND ((Code2 IN @MesVal2) OR (@MaVariable=1))
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Soit vous voulez faire cela en SQL dynamique, et vous pouvez 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
    DECLARE @MesVal1 VARCHAR(100),
    		@MesVal2 VARCHAR(100)
     
    SELECT @MesVal1  = '(''A123'',''B654'',''C657'')',
    		@MesVal2  = '(''C123'',''D654'',''E657'')'
     
    DECLARE @SQL VARCHAR(256),
    		@DefParam VARCHAR(64)
     
    SET @SQL = 'SELECT mesColonnes FROM MaTable WHERE Code1 IN ' + @MesVal1 +
    			' AND (Code2 IN ' + @MesVal2 + ' OR @MaVariable = 1'
     
    SET @DefParam = '@MaVariable INT'
     
    --PRINT @SQL
    EXEC master.dbo.sp_executesql @SQL, @DefParam, @MaVariable = 2
    Vous pouvez aussi faire cela avec une fonction :

    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
    ALTER FUNCTION FnSplit (@listeValeurs VARCHAR(MAX), @separateur CHAR(1))
    	RETURNS @TbListeValeurs TABLE(valeur VARCHAR(10))
    	WITH SCHEMABINDING
    AS
    BEGIN
    	;WITH CTE (Deb, Fin) AS 
    		( 
    				SELECT CAST(1 AS INT) Deb, CHARINDEX(@separateur, @listeValeurs + @separateur) Fin 
    			UNION ALL 
    				SELECT CAST(Fin + 1 AS INT) Fin, CHARINDEX(@separateur, @listeValeurs + @separateur, Fin + 1) 
    				FROM CTE 
    				WHERE CHARINDEX(@separateur, @listeValeurs + @separateur, Fin + 1 ) > 0 
    		)
    	INSERT INTO @TbListeValeurs (valeur)
    	SELECT SUBSTRING(@listeValeurs, Deb , Fin - Deb)
    	FROM CTE
     
    	RETURN
    END
    Et dans votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IF @MaVariable = 1
    BEGIN
    	SELECT mesColonnes
    	FROM dbo.MaTable T
    	JOIN dbo.FnSplit(@MesVal1, ',') VAL1 ON T.Code1 = VAL1.valeur
    END
    ELSE
    BEGIN
    	SELECT mesColonnes
    	FROM dbo.MaTable T
    	JOIN dbo.FnSplit(@MesVal1, ',') VAL1 ON T.Code1 = VAL1.valeur
    	JOIN dbo.FnSplit(@MesVal2, ',') VAL2 ON T.Code2 = VAL2.valeur
    END
    Vous pouvez voir ici pourquoi j'ai préféré écrire ELSE plutôt que d'utiliser OR.

    @++

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Merci, je m'en suis sorti avec votre première solution
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2012, 13h45
  2. Variable dynamique évaluable dans une procédure stockée
    Par fifrelin70 dans le forum Développement
    Réponses: 6
    Dernier message: 25/03/2011, 11h06
  3. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  4. Déclaration de variables dans une procédure stockée
    Par jbrasselet dans le forum Développement
    Réponses: 5
    Dernier message: 16/02/2009, 09h00
  5. Passer en paramétre un tableau dans une procédure stockée
    Par killysui dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/04/2006, 11h47

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