none
Muitos parâmetros na cláusula IN RRS feed

  • Pergunta

  • Tenho um relatório utilizando o esquema com a cláusula IN para buscar múltiplos valores. Se selecionar alguns dos parâmetros, o relatório funciona normalmente. Se selecionar muitos (ou todos), o relatório simplesmente fica em branco. É nitidamente um problema com o excesso de parâmetros na cláusula IN. Como resolver isso? Existe uma maneira de aumentar o limite, o tamanho da string da query, etc?
    segunda-feira, 20 de janeiro de 2014 11:27

Todas as Respostas

  • José,

    Você pode mostrar sua consulta ? Como você está montando seu "IN" ?

    Assim podemos ajudar com mais precisão.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 20 de janeiro de 2014 11:35
  • Nada de mais, o dataset está assim:

    SELECT        Matricula.cod_turma, Curso.nome AS curso, [vu_RESUL-FINAL].descricao AS ResultFinal, COUNT(Matricula.resultado_final) AS alunos, Turma.cod_curso, 
                             Turma.data_inicio, Turma.data_fim, vu_PERÍODO.descricao AS per, Turma.periodo
    FROM            Matricula INNER JOIN
                             Turma ON Matricula.cod_turma = Turma.cod_turma INNER JOIN
                             [vu_RESUL-FINAL] ON Matricula.resultado_final = [vu_RESUL-FINAL].codigo INNER JOIN
                             Curso ON Turma.cod_curso = Curso.cod_curso LEFT OUTER JOIN
                             vu_PERÍODO ON Turma.periodo = vu_PERÍODO.codigo
    WHERE        (Turma.cod_curso IN (@cod_curso)) AND (Turma.status IN (@status_turma))
    GROUP BY Matricula.cod_turma, Curso.nome, [vu_RESUL-FINAL].descricao, Turma.cod_curso, Turma.data_inicio, Turma.data_fim, vu_PERÍODO.descricao, 
                             Turma.periodo
    HAVING        (Matricula.cod_turma IN (@cod_turma)) AND (Turma.data_inicio <= GETDATE())

    E o parâmetro é enviado usando a opção "permitir vários valores". Utilizando até um número X de opções "ticadas" dos parâmetros, vai normal. Quando seleciona muitos ou todos, dá o problema.

    É nitidamente um "estouro" na string que irá trazer os valores que comporão o parâmetro que será utilziado no IN, mas não sei como resolver.

    segunda-feira, 20 de janeiro de 2014 17:45
  • José,

    Procure a declaração das variáveis do SQL e mude sua capacidade. Veja um exemplo:

    DECLARE @cod_curso VARCHAR(MAX) DECLARE @codturma VARCHAR(MAX)
    DECLARE @status_turma VARCHAR(MAX)

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    • Sugerido como Resposta Lucas D Santos terça-feira, 21 de janeiro de 2014 10:22
    segunda-feira, 20 de janeiro de 2014 17:49
  • Não sei exatamente o tamanho máximo no mssql pois nunca precisei, no oracle (11g)  existe um limite de 4000 palavras dentro de uma cláusula IN, um artifício que pode utilizar é criar uma tabela temporária.
    segunda-feira, 20 de janeiro de 2014 18:25
  • José já tentou com a solução do Durval? Se você estiver executando a consulta direto no sql será a solução.

    Ou está rodando a consulta via aplicação preenchendo o paramêmtro? Se for este caso pode ´tentar o código abaixo:

                string turmasSelecionadas = "1,2,3,5,6,7,8,9,10";
                System.Data.SqlClient.SqlParameter pCodTurma = new System.Data.SqlClient.SqlParameter("cod_turma", SqlDbType.VarChar);
                pCodTurma.Size = turmasSelecionadas.Length;
                pCodTurma.Value = turmasSelecionadas;


    • Editado Lucas D Santos terça-feira, 21 de janeiro de 2014 10:29
    • Sugerido como Resposta Lucas D Santos quarta-feira, 22 de janeiro de 2014 11:25
    • Não Sugerido como Resposta Lucas D Santos quarta-feira, 22 de janeiro de 2014 11:26
    • Sugerido como Resposta Lucas D Santos quarta-feira, 22 de janeiro de 2014 11:26
    terça-feira, 21 de janeiro de 2014 10:28