none
Retornar colunas de um determinado tipo RRS feed

  • Pergunta

  • Olá amigos tudo bem?

    Estou com uma dúvida relacionada a uma consulta SQL Server. Gostaria saber se é possível realizar um select em uma determinada tabela que me retorne apenas o conteúdo de um campo de um determinado tipo.

    Por exemplo: Dada uma Tabela Funcionario(Nome VARCHAR, Idade INTEGER, Cep INTEGER) existe uma maneira de fazer a consulta me retornar somente resultados relacionados aos campos de tipo INTEGER?

    Algo como SELECT * FROM Funcionario WHERE << TIPO DAS COLUNAS >> = INTEGER.

    É possível?

    Desde já agradeço, forte abraço.
    domingo, 3 de junho de 2007 04:08

Respostas

  • Oi, Rafael.

     

         Particularmente eu não conheço nenhum jeito simples de fazer isto que você quer (selecionar as colunas por tipo).

     

         Uma solução não-trivial seria você criar uma stored procedure que montasse o SELECT dinamicamente. Nessa stored procedure você poderia fazer uma consulta às tabelas sysobjects e syscolumns e retornar uma lista de colunas do tipo de que você quer. mais ou menos assim:

     

    Code Snippet
    SELECT name AS columnName FROM syscolumns
    WHERE id = (SELECT id AS tableID FROM sysobjects WHERE name = 'FUNCIONARIO')
    AND xtype = (SELECT xtype FROM systypes WHERE name = 'int')

          1. O código acima retornaria uma coluna chamada 'columnName' com uma listagem de todas as colunas do tipo INT da tabela Funcionario.

     

         Por sobre essa listagem você poderia realizar um WHILE (ou um cursor) e ir guardando os nomes das colunas retornadas numa variável de texto (VARCHAR, por exemplo).  Finalmente, você poderia montar um SELECT nessa variável e executá-la. Dessa forma, por exemplo:

     

    Code Snippet

    // Presume-se que a variável @ColunasSelecionadas tem um valor como "Idade, Cep" por causa do laço que foi feito em cima do retorno anterior...

    SET @ColunasSelecionadas = "SELECT " + @ColunasSelecionadas + " FROM Funcionario "

    EXEC @ColunasSelecionadas

     

         Você até pode conseguir o seu resultado utilizando um algoritmo como este mas não é recomendável fazer SELECTs (ou qualquer coisa, na verdade) nas tabelas de sistema do SQL Server. Assim como montar o comando de uma stored procedure dinamicamente também diminui a performance dela (devido a sempre ser necessário montar o texto).

     

         Você precisa mesmo descobrir as colunas dinamicamente? Pergunto isto porque uma outra solução, bem mais razoável, seria criar views somente com as colunas desejadas e chamar cada view de acordo com o que se deseja. Algo como View_Funcionario_Int ou View_Funcionario_Varchar, por exemplo.

     

         Bom, espero que isso o ajude.

     

    Abraço.

     

     

     

     

    domingo, 3 de junho de 2007 05:04

Todas as Respostas

  • Oi, Rafael.

     

         Particularmente eu não conheço nenhum jeito simples de fazer isto que você quer (selecionar as colunas por tipo).

     

         Uma solução não-trivial seria você criar uma stored procedure que montasse o SELECT dinamicamente. Nessa stored procedure você poderia fazer uma consulta às tabelas sysobjects e syscolumns e retornar uma lista de colunas do tipo de que você quer. mais ou menos assim:

     

    Code Snippet
    SELECT name AS columnName FROM syscolumns
    WHERE id = (SELECT id AS tableID FROM sysobjects WHERE name = 'FUNCIONARIO')
    AND xtype = (SELECT xtype FROM systypes WHERE name = 'int')

          1. O código acima retornaria uma coluna chamada 'columnName' com uma listagem de todas as colunas do tipo INT da tabela Funcionario.

     

         Por sobre essa listagem você poderia realizar um WHILE (ou um cursor) e ir guardando os nomes das colunas retornadas numa variável de texto (VARCHAR, por exemplo).  Finalmente, você poderia montar um SELECT nessa variável e executá-la. Dessa forma, por exemplo:

     

    Code Snippet

    // Presume-se que a variável @ColunasSelecionadas tem um valor como "Idade, Cep" por causa do laço que foi feito em cima do retorno anterior...

    SET @ColunasSelecionadas = "SELECT " + @ColunasSelecionadas + " FROM Funcionario "

    EXEC @ColunasSelecionadas

     

         Você até pode conseguir o seu resultado utilizando um algoritmo como este mas não é recomendável fazer SELECTs (ou qualquer coisa, na verdade) nas tabelas de sistema do SQL Server. Assim como montar o comando de uma stored procedure dinamicamente também diminui a performance dela (devido a sempre ser necessário montar o texto).

     

         Você precisa mesmo descobrir as colunas dinamicamente? Pergunto isto porque uma outra solução, bem mais razoável, seria criar views somente com as colunas desejadas e chamar cada view de acordo com o que se deseja. Algo como View_Funcionario_Int ou View_Funcionario_Varchar, por exemplo.

     

         Bom, espero que isso o ajude.

     

    Abraço.

     

     

     

     

    domingo, 3 de junho de 2007 05:04
  • Ola Rafael, não existe realmente uma maneira de mostrar em um select colunas de um tipo especifico somente como mencionado na resposta acima, caso voce queira em uma coluna retornar um valor especifico, por exemplo em uma coluna varchar voce quer somente dados do tipo int, voce pode fazer o seguinte:

     

    SELECT * FROM Funcionario WHERE isnumeric(Nome da coluna) = 1

     

    O select acima retorna somente dados que são inteiros, caso fosse o contrario era só trocar por 0

     

     

    Espero ter ajudado.

     

    Abraço

    sexta-feira, 22 de junho de 2007 11:54