*/

quarta-feira, 9 de julho de 2014

Como Listar Estrutura de Campos e Tabelas via query em SQL Server

Geralmente quando queremos saber informações sobre colunas e tabelas, no SQL Server usamos a store procedure sp_help [nome_tabela], mas o objetivo dessa query é filtrar determinadas condições a exemplo de tamanho de identificadores superiores a 30 caracteres, o clássico erro ORA-00972: identifier is too long. do Oracle, para quem trabalha com sistemas Multi SGBDR ou migração de dados, essa query resolve essa e outras perguntas.

Segue:

SELECT TABLE_CATALOG              AS BD
     , TABLE_SCHEMA               AS ESQUEMA_TABELA
     , TABLE_NAME                 AS TABELA 
     , COLUMN_NAME                AS COLUNA 
     , ORDINAL_POSITION           AS ORD_POS
     , DATA_TYPE                  AS TIPO 
     , CHARACTER_MAXIMUM_LENGTH   AS TAM_CARACTER
     , DATETIME_PRECISION         AS TAM_DATA
     , NUMERIC_PRECISION          AS TAM_NUMERICO
     , CASE WHEN CHARACTER_MAXIMUM_LENGTH  IS NOT NULL THEN
                CAST(CHARACTER_MAXIMUM_LENGTH AS NUMERIC(16,6))
            WHEN DATETIME_PRECISION IS NOT NULL THEN
                CAST(DATETIME_PRECISION AS NUMERIC(16,6))
            ELSE
                CAST(CAST(NUMERIC_PRECISION AS VARCHAR) + '.' + CAST( NUMERIC_SCALE AS VARCHAR) AS NUMERIC(16,6))
       END                        AS TAM
     , CASE WHEN IS_NULLABLE = 'YES' THEN
           'SIM'
       ELSE
           'NÃO'
       END                        AS [NULO?]
     , COLLATION_NAME             AS COLLATION
     , LEN(COLUMN_NAME)           AS TAM_NOME_COLUNA 
     , LEN(TABLE_NAME)            AS TAM_NOME_TABELA 
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE 1=1 
   --Testa condição de identificadores maior que 30 caracteres usado na migração para Oracle ou sistemas multi SGBDR
   --O clássico erro ORA-00972: identifier is too long. do Oracle, para quem trabalha com sistemas Multi SGBDR ou migração dados.
   --AND LEN(COLUMN_NAME) > 30 OR  LEN( TABLE_NAME) > 30 
   --Testa por nome de tabela   
   --AND TABLE_NAME  = 'NOME_TABELA'
   --Testa por coluna (campo) 
   --AND COLUMN_NAME = 'NOME_COLUNA'

Mais uma vez, espero ter ajudado. Seja feliz e fique na Paz de Jesus Cristo.

2 comentários: