Olá pessoal,
Uma coisa complicada quando se modela ou dá suporte a um bancos de dados, é entender a sua estrutura, para isso pensa-se em documentá-los com o Diagrama de Modelo de Entidades e Relacionamentos (DER ou MER) e/ou com o Dicionário de Dados (DD).
Na categoria Visio do Blog (at. https://sqlfromhell.wordpress.com/category/visio/ ) existe uma série de post descrevendo como fazer o Diagrama de Modelo de Entidades e Relacionamentos (DER ou MER), e no próprio Visio também pode ser feito o Dicionário de Dados (DD).
Como nem todos utilizam ou têm acesso ao Visio, neste post vou relacionar as queries utilizadas para consultar a relação de Tabelas, Colunas e Tipos de dados existentes no SQL Server 2000 ao 2008, que são úteis para realizar outras atividades, como “geradores de código” e “relatórios dinâmicos”.
Primeiramente, para relacionar as tabelas do SQL Server podemos fazer uso de system views para SQL Server 2005 e superiores:
SELECT * FROM sys.tables
ou para SQL Server 2000 e superiores:
SELECT * FROM sysobjects
WHERE xtype LIKE 'U'
Para relacionar as tabelas e suas respectivas colunas para SQL Server 2005 e superiores:
SELECT
T.name as Tabela,
C.name as Coluna
FROM sys.tables T
INNER JOIN sys.columns C
ON C.object_id = T.object_id
ou para SQL Server 2000 e superiores:
SELECT
T.name as Tabela,
C.name as Coluna
FROM sysobjects T
INNER JOIN syscolumns C
ON T.id = C.id
AND T.xtype LIKE 'U' -- Verifica se o tipo de objeto é uma tabela
Agora uma query from hell para relacionar as colunas ao seus respectivos tipos para SQL Server 2005 e superiores:
SELECT
T.name as Tabela,
C.name as Coluna,
TY.name as Tipo,
C.max_length, -- Tamanho em bytes, para nvarchar normalmente se divide este valor por 2
C.precision, -- Para tipos numeric e decimal (tamanho)
C.scale -- Para tipos numeric e decimal (números após a virgula)
FROM sys.columns C
INNER JOIN sys.tables T
ON T.object_id = C.object_id
INNER JOIN sys.types TY
ON TY.user_type_id = C.user_type_id
ORDER BY T.name, C.name
ou para SQL Server 2000 e superiores:
SELECT
T.name as Tabela,
C.name as Coluna,
TY.name as Tipo,
C.length, -- Tamanho em bytes, para nvarchar normalmente se divide este valor por 2 ou utiliza a 'prec'
C.prec, -- Para tipos numeric e decimal (tamanho)
C.scale -- Para tipos numeric e decimal (números após a virgula)
FROM syscolumns C
INNER JOIN sysobjects T
ON T.id = C.id
AND T.xtype LIKE 'U' -- Verifica se o tipo de objeto é uma tabela
INNER JOIN systypes TY
ON C.usertype = TY.usertype
AND C.xtype = TY.xtype
ORDER BY T.name, C.name
Agora, para qualquer banco de dados ANSI (MySQL, SQL Server, SQL Lite, PostgreSQL, Oracle), utilizando as system views do INFORMATION_SCHEMA, relacionando as colunas e seus respectivos tipos e tabelas:
SELECT
TABLE_NAME as Tabela,
COLUMN_NAME as Coluna,
DATA_TYPE as Tipo,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY Tabela, Coluna
ou somente as tabelas:
SELECT
TABLE_NAME as Tabela
FROM INFORMATION_SCHEMA.TABLES
ORDER BY Tabela
Pessoal até o próximo post!