Se você precisar encontrar todas as tabelas que tenham uma chave primária no SQL Server, este artigo pode ajudar.
Este artigo oferece sete maneiras de retornar todas as tabelas no banco de dados atual que possuem uma chave primária.
Observe que a maioria desses exemplos retorna apenas as tabelas – não as próprias chaves primárias. Se você quiser uma lista de chaves primárias, consulte 11 maneiras de retornar uma chave primária no SQL Server.
Opção 1 – OBJECTPROPERTY() com sys.tables
A primeira opção envolve usar o
OBJECTPROPERTY()
função ao consultar o sys.tables
visão do sistema. Esta função aceita um TableHasPrimaryKey
argumento. Se este argumento tiver um valor de 1
, obtemos todas as tabelas que possuem uma chave primária (se for 0
então obtemos todas as tabelas que não possuem uma chave primária). SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Neste exemplo, o banco de dados atual possui quatro tabelas com uma chave primária.
Os exemplos restantes consultarão o mesmo banco de dados, portanto, os resultados serão os mesmos para essas consultas.
Opção 2 – OBJECTPROPERTY() com INFORMATION_SCHEMA.TABLES
Este exemplo usa
OBJECTPROPERTY()
novamente, mas desta vez estou consultando o INFORMATION_SCHEMA.TABLES
visualizar. SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
Resultado:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------------+--------------+
Opção 3 – OBJECTPROPERTY() com sys.objects
Mais uma vez
OBJECTPROPERTY()
vem em socorro. Desta vez estou consultando o sys.objects
visão do sistema. SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type = 'U' AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table]
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Opção 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Você pode consultar o
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
view para obter uma lista de tabelas com chaves primárias. Você precisa filtrar os resultados apenas para as linhas que têm um CONSTRAINT_TYPE
de PRIMARY KEY
. SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Resultado:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +---------------------+--------------+
Essa exibição também retorna o nome da restrição, portanto, você também pode incluir essa coluna, se necessário:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Resultado:
+---------------------+--------------+-------------------------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME | |---------------------+--------------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +---------------------+--------------+-------------------------------+
Opção 5 – sys.key_constraints
Você pode filtrar as
sys.key_constraints
ver um CONSTRAINT_TYPE
de PK
para obter uma lista de tabelas com chaves primárias. SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Aqui está novamente com o nome da chave primária:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Opção 6 – sys.objects
Os
sys.objects
a visualização do sistema é popular para retornar informações sobre objetos com escopo de esquema, incluindo chaves primárias. SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.objects WHERE type = 'PK';
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Assim como nos dois exemplos anteriores, podemos incluir o
name
coluna desta visualização para exibir o nome da chave primária:SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.objects WHERE type = 'PK';
Resultado:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Opção 7 – OBJECTPROPERTYEX()
O
OBJECTPROPERTYEX()
A função funciona exatamente como a OBJECTPROPERTY()
função, exceto que ele suporta mais propriedades. Portanto, qualquer um dos exemplos anteriores que usam OBJECTPROPERTY()
, pode ser facilmente reescrito para usar OBJECTPROPERTYEX()
. Por exemplo, eu poderia reescrever o primeiro exemplo nesta página para o seguinte:
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Devo mencionar que
OBJECTPROPERTYEX()
retorna um sql_variant tipo de dados, enquanto OBJECTPROPERTY()
retorna um int .