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.