none
SELECT COM CAMPOS DINÂMICOS (SQL Server) RRS feed

  • Pergunta

  • Olá pessoal,

    Estou querendo fazer um select no SQL Server com campos dinâmicos. Ele deve selecionar apenas os campos aonde não haverá nenhum valor nulo.

    Por exemplo, tenho uma tabela com 5 campos e várias linhas. Porém, independente dos valores que eles possuem nas linhas, apenas o campo2 está preenchido em todas elas. Então, meu select deve selecionar apenas o campo2. Num outro caso, apenas o campo1 e campo5 irão possuir valores em todas as linhas, então o select deverá selecionar apenas o campo1 e campo5.

    Agradeço quem puder me ajudar.

    Abraços!

    quarta-feira, 6 de agosto de 2014 14:10

Respostas

Todas as Respostas

  • Deleted
    quarta-feira, 6 de agosto de 2014 14:56
  • Não usual... Para saber quais colunas possuem todas as linhas com valor informado, primeiro será necessário consultar toda a tabela.

    Eis uma primeira sugestão.

    -- código 1
    -- conta em quantas linhas cada coluna está informada
    declare @CT int, @C1 int, @C2 int, @C3 int, @C4 int, @C5 int; SELECT @CT= Count(*), @C1= Count(coluna1), @C2= Count(coluna2),
    @C3= Count(coluna3), @C4= Count(coluna4), @C5= Count(coluna5) from tabela;
    -- verifica se ao menos uma coluna atende ao requisito
    IF @CT = @C1 or @CT = @C2 or @CT = @C3 or @CT = @C4 or @CT = @C5
    begin
    -- monta comando SQL com somente as colunas que estejam completamente informadas
    declare @ComandoSQL varchar(2000);
    set @ComandoSQL= 'SELECT ' + case when @C1 = @CT then 'coluna1,' else '' end + case when @C2 = @CT then 'coluna2,' else '' end + case when @C3 = @CT then 'coluna3,' else '' end + case when @C4 = @CT then 'coluna4,' else '' end + case when @C5 = @CT then 'coluna5,' else '' end; set @ComandoSQL= Left(@ComandoSQL, Len(@ComandoSQL) -1) + ' from tabela;'; --
    PRINT @ComandoSQL --EXEC (@ComandoSQL ); end;




        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)


    José Diz,

    Mesmo não sendo uma prática fácil e até mesmo indicada, mas gostei do seu código de exemplo, vou tomar a liberdade de copiar para minha biblioteca de scripts.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 6 de agosto de 2014 15:16
  • Jose,

    Excelente o seu código. Funcionou muito bem aqui num primeiro momento, como teste.

    Irei montar minha tabela real e executá-lo para os demais casos. Creio que irá funcionar da mesma forma, caso contrário lhe aviso.

    Muito obrigado.

    Abraços!

    quarta-feira, 6 de agosto de 2014 16:51
  • Deleted
    quarta-feira, 6 de agosto de 2014 17:41
  • Deleted
    quarta-feira, 6 de agosto de 2014 17:44
  • José,

    Como ainda estou montando a tabela, não posso dizer com certeza. Mas tendo em base tabelas semelhantes que possuo, posso dizer que em torno de 150 mil a 300 mil linhas.

    E não há a possibilidade de uma linha ser preenchida totalmente com valores NULL, isso porque existem campos obrigatórios. Então sempre haverá ao menos três campos preenchidos, sempre.

    Agradeço muito sua ajuda até aqui e até pelo empenho de melhorar o desempenho da consulta.

    Abraços.

    quarta-feira, 6 de agosto de 2014 18:48