Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

P.Brito

Query SQL Server colunas + chaves

Recommended Posts

Galera, boa tarde.

 

Estou precisando de uma query que me traga todas as colunas do banco com suas respectivas chaves. Porém eu preciso que quando uma coluna não for chave, a mesma venha especificada nessa query também.

 

Ex:

 

TABLE_TESTE:

 

COLUNA1: PK

COLUNA2: FK

COLUNA3: NULL(ou seja, não é fk nem pk)

 

Porque atualmente eu consigo buscar todas as colunas e tabelas, mas não consigo determinar suas respectivas chaves sem excluir as colunas que não são chaves.

 

Alguem consegue me ajudar?

 

Atenciosamente,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algumas ideias:

 

 

SELECT s.name as [schema], t.name as [table]
, SUBSTRING(c.[columns], 0, LEN(c.[columns])) AS [columns]
FROM sys.schemas s
INNER JOIN sys.tables t
ON s.[schema_id] = t.[schema_id]
-- Relação de colunas [columns]
CROSS APPLY (
SELECT (
SELECT c.name + ', '
FROM sys.columns c
WHERE t.[object_id] = c.[object_id]
FOR XML PATH('')
) AS [columns]
) AS c
return
SELECT
OBJECT_NAME(foreigns_columns.[referenced_object_id]) Parent_Table,
OBJECT_NAME(foreigns_columns.[parent_object_id]) Child_Table,
OBJECT_NAME(foreigns_columns.[constraint_object_id]) Key_Name,
parent_columns.name Parent_Col,
child_columns.name Child_KeyCol
FROM sys.foreign_key_columns foreigns_columns
INNER JOIN sys.columns parent_columns
ON parent_columns.[object_id] = foreigns_columns.[parent_object_id]
AND parent_columns.[column_id] = foreigns_columns.[parent_column_id]
INNER JOIN sys.columns child_columns
ON child_columns.[object_id] = foreigns_columns.[referenced_object_id]
AND child_columns.[column_id] = foreigns_columns.[referenced_column_id]
ORDER BY Parent_Table, Child_Table
SELECT
KU.TABLE_NAME Parent_Table,
KU2.TABLE_NAME Child_Table,
FK.CONSTRAINT_NAME FKey_Name,
KU.COLUMN_NAME Parent_Col,
KU2.COLUMN_NAME Child_Col
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS FK
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KU
ON KU.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KU2
ON KU2.CONSTRAINT_NAME = FK.UNIQUE_CONSTRAINT_NAME
AND KU.ORDINAL_POSITION = KU2.ORDINAL_POSITION
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado A.Jr, porém descobrir como fazer a query, ela é bem simples na verdade, mas é necessário fazer um sub select.

 

Para quem quiser, segue:

 

SELECT A.table_name,
A.column_name
FROM information_schema.columns A
WHERE column_name LIKE 'ID%'
AND table_name LIKE 'EPT_%'
AND column_name NOT IN (SELECT column_name
FROM information_schema.constraint_column_usage
B
WHERE B.table_name = A.table_name
AND B.column_name = A.column_name)
ORDER BY A.table_name,
A.column_name

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.