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

Use OBJECT_NAME() para obter o nome de um objeto de seu object_id no SQL Server


Ao usar o SQL Server, se você estiver prestes a fazer uma junção no sys.objects visualização do catálogo do sistema para obter o nome de um objeto, talvez pare e leia isso primeiro.

Transact-SQL tem uma função interna chamada OBJECT_NAME() que retorna o nome de um objeto, com base em seu ID.

Em outras palavras, se você tiver o ID do objeto (por exemplo, o object_id coluna), você pode simplesmente passar esse ID para o OBJECT_NAME() função, e ele retornará o nome do objeto para você – sem necessidade de junção!


Exemplo 1 – Uso básico


Aqui está um exemplo básico para demonstrar como funciona.
SELECT 
  name,
  object_id,
  OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]
FROM sys.objects
WHERE name = 'Artists';

Resultado:
+---------+-------------+--------------------------+
| name    | object_id   | OBJECT_NAME(object_id)   |
|---------+-------------+--------------------------|
| Artists | 885578193   | Artists                  |
+---------+-------------+--------------------------+

Aqui, podemos ver que as duas primeiras colunas exibem o nome e o ID do objeto, respectivamente. A terceira coluna usa o OBJECT_NAME() função para retornar o nome do ID.

Este é obviamente apenas um exemplo, mas neste caso, usando OBJECT_NAME() era desnecessário porque sys.objects já retorna o nome do objeto.

O próximo exemplo mostra onde OBJECT_NAME() pode ser útil.

Exemplo 2 – Um exemplo mais útil


Neste exemplo, eu retorno informações sobre uma chave estrangeira consultando o sys.foreign_keys visualização do catálogo do sistema.

Primeiro, vamos selecionar todas as colunas para ver o que é retornado por esta visualização:
USE Music;
SELECT * 
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Resultado (usando saída vertical):
name                           | FK_Artists_Country
object_id                      | 1253579504
principal_id                   | NULL
schema_id                      | 1
parent_object_id               | 885578193
type                           | F 
type_desc                      | FOREIGN_KEY_CONSTRAINT
create_date                    | 2019-08-27 16:14:39.560
modify_date                    | 2019-08-28 03:28:07.040
is_ms_shipped                  | 0
is_published                   | 0
is_schema_published            | 0
referenced_object_id           | 1205579333
key_index_id                   | 1
is_disabled                    | 0
is_not_for_replication         | 0
is_not_trusted                 | 0
delete_referential_action      | 0
delete_referential_action_desc | NO_ACTION
update_referential_action      | 0
update_referential_action_desc | NO_ACTION
is_system_named                | 0

Essa exibição retorna o nome da chave estrangeira, mas não o nome de seu objeto pai. Nem retorna o nome do objeto referenciado da chave estrangeira. Ele retorna apenas o ID desses objetos (ou seja, parent_object_id e referenced_object_id ).

Então, se fôssemos restringir apenas a essas colunas, teríamos algo assim:
USE Music;
SELECT
  name,
  parent_object_id,
  referenced_object_id
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Resultado:
+--------------------+--------------------+------------------------+
| name               | parent_object_id   | referenced_object_id   |
|--------------------+--------------------+------------------------|
| FK_Artists_Country | 885578193          | 1205579333             |
+--------------------+--------------------+------------------------+

Felizmente, podemos passar as duas últimas colunas para OBJECT_NAME() para recuperar os nomes dos objetos.

Aqui está o que podemos fazer para retornar os nomes.
USE Music;
SELECT
  name AS [Foreign Key],
  OBJECT_NAME(parent_object_id) AS [Parent Object Name],
  OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Resultado:
+--------------------+----------------------+--------------------------+
| Foreign Key        | Parent Object Name   | Referenced Object Name   |
|--------------------+----------------------+--------------------------|
| FK_Artists_Country | Artists              | Country                  |
+--------------------+----------------------+--------------------------+

Para as duas últimas colunas, passo os valores relevantes para o OBJECT_NAME() função para que ela retorne o nome de cada objeto pai.

Exemplo 3 – Usando OBJECT_NAME() em uma cláusula WHERE


Aqui está um exemplo de uso de OBJECT_NAME() em um WHERE cláusula.
SELECT 
  name, 
  object_id, 
  type_desc  
FROM sys.objects  
WHERE name = OBJECT_NAME(1253579504);

Resultado:
+--------------------+-------------+------------------------+
| name               | object_id   | type_desc              |
|--------------------+-------------+------------------------|
| FK_Artists_Country | 1253579504  | FOREIGN_KEY_CONSTRAINT |
+--------------------+-------------+------------------------+

Consultas entre bancos de dados


Por padrão, o SQL Server assume que a identificação do objeto está no contexto do banco de dados atual. Uma consulta que faz referência a um ID em outro banco de dados retorna resultados NULL ou incorretos.

Se você precisar encontrar um nome de objeto de um banco de dados diferente, você pode fornecer o ID desse banco de dados como um segundo argumento ao chamar OBJECT_NAME() .

Consulte Como obter um OBJECT_NAME() de um banco de dados diferente no SQL Server para obter exemplos.