Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

7 maneiras de retornar todas as tabelas com uma chave primária no SQL Server


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 .