Erro ao usar parametro na clausula Select IN( Lista )

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
ligerinho21
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Dom, 28 Mar 2010 2:22 pm
Localização: SP

Olá Pessoal Boa Tarde,
Galera estou com uma duvida e gostaria que me ajudassem a entender o porque não consigo trazer como parâmetro uma lista que criei a partir de checkbox chegados na minha aplicação em C# + ASP.NET , é o seguinte tenho 3 tabelas(Treinamentos , Participantes e Funcionários) ou seja um treinamento tem vários participantes(Funcionários), então quando Seleciono no GridView da minha aplicação os participante eu monto uma Lista de selecionados e gravo no banco da seguinte forma (‘1’,’2’,’3’,’4’,’5’) , sendo assim preciso usar esses dados como parâmetro na minha clausula IN.
Ficando assim:

Selecionar tudo

SELECT FUNC_ID FROM FUNCIONARIOS
WHERE FUNC_ID  IN  (‘1’,’2’,’3’,’4’,’5’)

dessa maneira consigo recuperar todos os participantes daquele treinamento porem na procedure não esta reconhecendo o parâmetro como String/Varchar alguém sabe como faço pra usar essa lista como parâmetro na clausula IN do SQL SERVER 2008 ? ficarei muito grato pois já tentei varias forma porem sem sucesso , a baixo segue a Procedure com a logica completa.

Descrição das Tabelas

Selecionar tudo

Funcionarios (FUNC_ID INT,FUNC_NOME VARCHAR(50))
Treinamentos(TREI_ID INT,TREI_NOME VARCHAR (50))
TREINAMENTOS_PARTICIPANTES(TREI_ID INT , TRPA_LIST_PARTICIPANTES VARCHAR (50)

obs: os dados da lista são gravados da seguinte forma, '1','2','3'

Selecionar tudo

/*Procedure Busca Participantes*/
CREATE PROCEDURE Busca_Participantes (
@TREI_ID as INT
)
AS

DECLARE @ListaFunc_IDs VARCHAR(500)

BEGIN

SET @ListaFunc_IDs = @ListaFunc_IDs + (SELECT TRPA_LIST_PARTICIPANTES FROM TREINAMENTOS_PARTICIPANTES

WHERE TREI_ID = (@TREI_ID))

END

BEGIN


SELECT FUNC_ID FROM FUNCIONARIOS

WHERE FUNC_ID  IN  (@ListaFunc_IDs)

	
END
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Cara, acho que você terá que varrer a sua string e montar o sql dinamicamente, para que consiga colocar os valores no IN.
ligerinho21
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Dom, 28 Mar 2010 2:22 pm
Localização: SP

Olá Diego, obrigado pela dica mas ontem mesmo resolvi o problema usei outro modo na hora de gravar segue procedure para sua analise ok , obrigado se um dia precisar pode contar comigo.


Para Gravar

Selecionar tudo

CREATE PROCEDURE InseriListaFunc_TreinamentoID 
      (  
            /*@MemberId int,*/
            @TREI_ID int,
            /*@MemberProductId*/
            @LIST_FUNC_ID varchar(100)
       )
AS 

DECLARE @count int  
DECLARE @str VARCHAR(8000)
DECLARE @spot SMALLINT
  

WHILE @LIST_FUNC_ID <> ''

BEGIN 
        SET @spot = CHARINDEX(',', @LIST_FUNC_ID) 
         IF @spot>0 
            BEGIN 
                SET @str = CAST(LEFT(@LIST_FUNC_ID, @spot-1) AS INT)                
                SET @LIST_FUNC_ID = RIGHT(@LIST_FUNC_ID, LEN(@LIST_FUNC_ID)-@spot) 
            END 
        ELSE 
            BEGIN 
                 SET @str = CAST(@LIST_FUNC_ID AS INT)
                SET @LIST_FUNC_ID = ''
            END 

SELECT @count = count (1) FROM TREINAMENTOS_PARTICIPANTES  
     WHERE TREI_ID =@str 
     
     IF @count =0

BEGIN 
       INSERT INTO TREINAMENTOS_PARTICIPANTES (TREI_ID,FUNC_ID)
                    VALUES (  @TREI_ID,@str) 
     END 
    END 
      RETURN 
GO 

Para Recuperar

Selecionar tudo

SELECT DISTINCT F.FUNC_ID, F.FUNC_NOME AS NOME,
				C.CARG_NOME AS CARGO,
			    D.DEPA_DESCR AS DEPARTAMENTO
FROM FUNCIONARIOS AS F 
INNER JOIN CARGOS AS C ON F.CARG_ID = C.CARG_ID
INNER JOIN DEPARTAMENTOS AS D ON F.DEPA_ID = D.DEPA_ID
WHERE FUNC_ID IN (SELECT FUNC_ID FROM TREINAMENTOS_PARTICIPANTES WHERE TREI_ID = 2)
´
É isso ai amigão.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 20 visitantes