none
Como Usar Clausula "IN" em variável RRS feed

  • Pergunta

  • Pessoal,

    Como faço para utilizar a clausula IN em um DataTable?

    Exemplo.

    Select * from clientes

    where cliente IN (@Clientes) 

    Estou testando no Construtor de consultas do VS. Quando coloco somente um cliente funciona, agora quando coloco cliente1, cliente2 ele não retorna nenhum valor.

    terça-feira, 21 de outubro de 2014 13:50

Respostas

  • Arivaldo, isso funciona:

    DECLARE @Clientes VARCHAR(MAX)
     --SET @Clientes = '3,4,22'
    
    DECLARE @SQL NVARCHAR(4000)
        SET @SQL = 'SELECT * FROM Clientes WHERE Cliente IN (' + @Clientes + ')'
     BEGIN
    
       EXEC sp_executesql @SQL
    
     END
     
    Marque como resposta, se foi útil!



     

    • Sugerido como Resposta Deric Ferreira terça-feira, 21 de outubro de 2014 16:06
    • Marcado como Resposta Arivaldo Manoel terça-feira, 21 de outubro de 2014 16:53
    terça-feira, 21 de outubro de 2014 16:06
  • Realmente na queryBuilder se o campo for int só aceita apenas um único argumento e se for varchar só aceita também um e ignora o separador.

    A saída é fazer manualmente sem a queryBuilder, eu sinceramente prefiro manualmente pois você terá controle total.
    • Marcado como Resposta Arivaldo Manoel terça-feira, 21 de outubro de 2014 16:53
    terça-feira, 21 de outubro de 2014 16:52

Todas as Respostas

  • Luan,

    Desculpe meu erro, na verdade estou usando um TableAdapter para se conectar a um banco que já tenho pronto...

    então estou usando o Assistente de Configuração para testar a consulta.

    Não existe nenhuma forma do Construtor de Consultas me retornar estes valores?

    Ou só poderei fazer isso alterando código do Form?

    terça-feira, 21 de outubro de 2014 14:11
  • O problema é o conteúdo do parâmetro @Clientes quando tem mais de um selecionado. Como você está preenchendo essa variável?

    Ela deve conter valores separados por ",". Se for numérico: IN(1,2). Se for texto: IN('A','B').

    Marque como resposta se foi útil!

    • Sugerido como Resposta Deric Ferreira terça-feira, 21 de outubro de 2014 14:14
    terça-feira, 21 de outubro de 2014 14:14
  • Estou preenchendo com vírgulas,

    Agora testei com as aspas também, mas de nenhum dos jeitos funciona.

    terça-feira, 21 de outubro de 2014 14:29
  • Cole o valor do parâmetro aqui, por favor.
    • Sugerido como Resposta Deric Ferreira terça-feira, 21 de outubro de 2014 14:32
    terça-feira, 21 de outubro de 2014 14:32
  • O parâmetro Cliente você esta passando o cliente em si ou o código do cliente e como você esta acumulando esse valor se for mais de um cliente escolhido?
    terça-feira, 21 de outubro de 2014 14:38
  • Já tentei com o Cod_Cliente (Código do Cliente) e com o Cliente (Nome do Cliente)

    Select * from Clientes
    where Cliente in (@Clientes)
    
    --Quando aparece a caixinha pedindo o valor para a variável digito Cliente1 (funciona) ou CLiente1,Cliente2 (não funciona). Já tentei com as aspas também.
    
    

    Select * from Clientes
    Where Cod_Cliente in (@Cod)
    
    --Quando pede o valor eu digito 1 (funciona) ou 1,2 (não funciona)
    Também já tentei com as aspas

    terça-feira, 21 de outubro de 2014 15:35
  • Onde você esta inserindo esses valores para a consulta dos parâmetros você esta informando o tipo que esta inserindo?

    Tira o print e posta aqui (nos dois casos você deve estar informando parâmetros incorretos
    terça-feira, 21 de outubro de 2014 15:47
  • DECLARE @Clientes VARCHAR(MAX)
     --SET @Clientes = '3,4,22'
    
    DECLARE @SQL NVARCHAR(4000)
        SET @SQL = 'SELECT * FROM Clientes WHERE Cliente IN (' + @Clientes + ')'
     BEGIN
    
       EXEC sp_executesql @SQL
    
     END
     
    Marque como resposta, se foi útil!

    • Sugerido como Resposta Deric Ferreira terça-feira, 21 de outubro de 2014 15:56
    • Editado Deric Ferreira terça-feira, 21 de outubro de 2014 16:04
    terça-feira, 21 de outubro de 2014 15:56
  • Aqui está a forma que estou tentando inserir os dados, e não funciona.

    Deste mesmo modo quando coloco somente um valor, funciona.

    terça-feira, 21 de outubro de 2014 16:04
  • Utilizando o Query Builder, creio que não conseguirá utilizar a cláusula IN.

    Possui alguma restrição para criar store procedures ?

    terça-feira, 21 de outubro de 2014 16:06
  • Arivaldo, isso funciona:

    DECLARE @Clientes VARCHAR(MAX)
     --SET @Clientes = '3,4,22'
    
    DECLARE @SQL NVARCHAR(4000)
        SET @SQL = 'SELECT * FROM Clientes WHERE Cliente IN (' + @Clientes + ')'
     BEGIN
    
       EXEC sp_executesql @SQL
    
     END
     
    Marque como resposta, se foi útil!



     

    • Sugerido como Resposta Deric Ferreira terça-feira, 21 de outubro de 2014 16:06
    • Marcado como Resposta Arivaldo Manoel terça-feira, 21 de outubro de 2014 16:53
    terça-feira, 21 de outubro de 2014 16:06
  • É estou achando que não vai dar certo por aqui mesmo.

    Não possuo restrição não... Vou pesquisar aqui como faço via código mesmo.

    terça-feira, 21 de outubro de 2014 16:13
  • o Query Builder diz que não há suporte para a instrução Declare.

    Então acho que por aqui não vai dar certo mesmo.

    terça-feira, 21 de outubro de 2014 16:13
  • Realmente na queryBuilder se o campo for int só aceita apenas um único argumento e se for varchar só aceita também um e ignora o separador.

    A saída é fazer manualmente sem a queryBuilder, eu sinceramente prefiro manualmente pois você terá controle total.
    • Marcado como Resposta Arivaldo Manoel terça-feira, 21 de outubro de 2014 16:53
    terça-feira, 21 de outubro de 2014 16:52
  • Seria mais interessante efetuar a consulta manualmente, utilizando SqlCommand, criei um método de exemplo que você pode adaptar de acordo com as suas necessidades:

    public List<Cliente> ConsultarClientes(params string[] Codigos)
            {   
                //Classe de retorno de acordo com o resultado do seu select, classe POCO, Entidade...
                List<Cliente> clientes = new List<Cliente>();
                using (SqlConnection connection = new SqlConnection(@"STRING DE CONEXÃO"))
                {
                    connection.Open();
                    using (SqlCommand command = connection.CreateCommand())
                    {   
                        //Comando SQL com cláusula IN
                        command.CommandText = String.Format(@"SELECT CODIGO_CLIENTE, CLIENTE_VAREJO FROM CLIENTESVAREJO WHERE CLIENTE_VAREJO IN ({0})",
                            string.Join(",", Codigos.Select(x => "'" + x + "'")));
                        SqlDataReader reader = command.ExecuteReader();
                        while (reader.Read())
                        {   
                            clientes.Add(new Cliente{ 
                                Codigo = reader.GetInt32(0), 
                                Varejo = reader.GetString(1) });
                        }
                    }
                }
    
                return clientes;
            }

    Classe de retorno utilizada para testes:

    public class Cliente
        {
            public int Codigo { get; set; }
            public string Varejo { get; set; }
        }

    Exemplo da utilização do método:

    //Chamada do método
    ConsultarClientes("1234", "456");
    //Ou
    List<string> codigoClientes = new List<string>();
    codigoClientes.Add("1234");
    codigoClientes.Add("456");
    ConsultarClientes(codigoClientes.ToArray());

    Espero que lhe ajude.




    • Editado Luan Bon terça-feira, 21 de outubro de 2014 17:12
    terça-feira, 21 de outubro de 2014 17:09