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 :

Procédure stockée : selection selon un paramètre contenat une liste d'id


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut Procédure stockée : selection selon un paramètre contenat une liste d'id
    Bonjour,

    Est ce que quelqu'un peut m'aider, car j'ai un petit soucis : j'ai une PS :

    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
     
    CREATE PROCEDURE [dbo].[sp_document_select]
    	@doc_id	INT			=NULL,
    	@prj_id		INT			=NULL,
    	@per_id	INT			= NULL,
    	@tsk_id		INT			= NULL,
    	@sta_id		INT			= NULL,
    	@dot_id	INT			= NULL,
    	@sys_id	INT			= NULL,
    	@doc_status     BIT 			= 1,
    	@doc_connected 	BIT  		= NULL,
    	@dot_code	char(10)			= NULL 		
     
    AS
    BEGIN
     
     
    	SELECT doc.*, dov.*,dot.*,sta.sta_color,sta.sta_name,per.org_id,per.per_firstname + ' ' + per.per_lastname as 'fullname',document_task.*
    	FROM dbo.document doc	
    	INNER JOIN document_version dov ON dov.doc_id = doc.doc_id AND dov.dov_iscurrent = 1 --récuperer tjr la version courante du document
    	INNER JOIN document_type dot ON dot.dot_id = doc.dot_id
    	LEFT JOIN state sta ON sta.sta_id = doc.doc_state
    	INNER JOIN person per ON per.per_id = doc.per_id_owner
    	LEFT JOIN document_task ON document_task.doc_id = doc.doc_id
    	WHERE (doc.prj_id=@prj_id OR @prj_id IS NULL)
    	AND (doc.doc_id=@doc_id OR @doc_id IS NULL)
    	AND (doc.doc_status=@doc_status OR @doc_status IS NULL)
    	AND (@sys_id IS NULL OR EXISTS(SELECT 1 FROM document_system where document_system.sys_id = @sys_id AND document_system.doc_id = doc.doc_id))
    	AND (@tsk_id IS NULL OR EXISTS(SELECT 1 FROM document_task where document_task.tsk_id = @tsk_id AND document_task.doc_id = doc.doc_id))
    	AND (sta.sta_id=@sta_id OR @sta_id IS NULL)
    	AND (dot.dot_id=@dot_id OR @dot_id IS NULL)
    	AND (doc.doc_connected=@doc_connected OR @doc_connected IS NULL)
    	AND (dot.dot_code=@dot_code OR @dot_code IS NULL)
    	ORDER BY doc.doc_name ASC
     
     
    END
    GO
    à cette PS je voudrais ajouter un paramètre de type VARCHAR qui contiendra éventuellement une liste d'id ('7,5,8,9') donc je voudrais ajouter ce test dans la clause where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (AND doc_id IN (' + @IdsList + '))
    sauf que cela bien sûr ne marche pas, si je veux garder la requête en direct (sans passer par un exec).

    J'ai pensé à faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DECLARE @tmp_document_list TABLE(doc_id INT);
    DECLARE @IdsList varchar(100)
    DECLARE @query varchar(2000)
    set @IdsList = '7,6,5,4'
     
    set @query = 'INSERT INTO @tmp_document_list (doc_id) SELECT doc_id FROM document where doc_id in (' + @IdsList + ')'
     
    EXEC sp_executeSQL @query, N'@tmp_document_list TABLE(doc_id INT) OUTPUT', @tmp_document_list OUTPUT
    et rajouter un test à ma première requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND (doc_id IN (SELECT doc_id FROM @tmp_document_list)
    Mais sauf que les paramètres de type TABLE ne sont pas pris en compte pour sp_executeSQL.

    Ainsi, j'ai épuisé toutes mes idées.

    Avez vous une idée ?

    Merci

    H.BARADI

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    si c'est une ps tu peux t'arranger pour créer une table tempo avec tes infos
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table #doc
    (id_doc int)
     
    while charindex(',',@IdsList)>0
      begin
        insert into #doc values(substring(@IdsList,1,charindex(',',@IdsList)-1))
        set @IdsList=substring(@IdsList,charindex(',',@IdsList)+1,10000)
      end
    il te suffit de rjouter la jointure sur cette table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    inner join #doc dc on dc.id_doc=doc_id

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Par défaut
    Crée cette 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE FUNCTION [dbo].[UDF_CHARLIST_TO_TABLE]
            (@p_LIST      nvarchar(1000),
             @p_DELIMITER nchar(1) = N',')
     RETURNS @TABLE_LIST TABLE (LISTPOS    int IDENTITY(1, 1) NOT NULL,
                                 [STRING]  varchar(4000),
                                 [NSTR]    nvarchar(2000)) 
    AS
    BEGIN
        DECLARE @v_POS      int,
                @v_TEXTPOS  int,
                @v_LEFTOVER nvarchar(4000),
                @v_TMPVAL   nvarchar(4000)
     
        SET @v_TEXTPOS = 1
     
        SET @v_POS = charindex(@p_DELIMITER, @p_LIST)
     
        WHILE @v_POS > 0
        BEGIN
            SET @v_TMPVAL = ltrim(rtrim(left(@p_LIST, @v_POS - 1)))
            INSERT @TABLE_LIST ([STRING], NSTR) VALUES(@v_TMPVAL, @v_TMPVAL)
            SET @p_LIST = substring(@p_LIST, @v_POS + 1, len(@p_LIST))
            SET @v_POS = charindex(@p_DELIMITER, @p_LIST)
        END
     
        INSERT @TABLE_LIST([STRING], NSTR) VALUES (ltrim(rtrim(@p_LIST)), ltrim(rtrim(@p_LIST)))
     
       RETURN
    END

    Et Ensuite quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO MaTable
    SELECT champ FROM MonAutreTable T1
    JOIN (SELECT STRING FROM [UDF_CHARLIST_TO_TABLE](@IdsList , ',')) T2 ON CAST(T1.ID AS varchar(50)) = T2.STRING

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/11/2014, 10h57
  2. [Débutant] implémenter une procédure stockée SELECT en SQL SERVER avec Entity Framework
    Par Alexandre le Grand dans le forum Entity Framework
    Réponses: 5
    Dernier message: 09/01/2014, 16h04
  3. Réponses: 15
    Dernier message: 05/06/2013, 17h08
  4. Réponses: 0
    Dernier message: 10/11/2009, 09h30
  5. Réponses: 1
    Dernier message: 03/09/2009, 12h39

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