sql >> Base de Datos >  >> RDS >> Sqlserver

Use OBJECT_NAME() para obtener el nombre de un objeto de su object_id en SQL Server

Cuando utilice SQL Server, si alguna vez se encuentra a punto de realizar una unión contra sys.objects vista de catálogo del sistema para obtener el nombre de un objeto, quizás deténgase y lea esto primero.

Transact-SQL tiene una función integrada llamada OBJECT_NAME() que devuelve el nombre de un objeto, basado en su ID.

En otras palabras, si tiene el ID del objeto (por ejemplo, el object_id columna), simplemente puede pasar esa ID a OBJECT_NAME() y le devolverá el nombre del objeto, ¡no es necesario unirse!

Ejemplo 1:uso básico

Aquí hay un ejemplo básico para demostrar cómo 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                  |
+---------+-------------+--------------------------+

Aquí, podemos ver que las dos primeras columnas muestran el nombre y la identificación del objeto, respectivamente. La tercera columna usa el OBJECT_NAME() función para devolver el nombre del ID.

Obviamente, esto es solo un ejemplo, pero en este caso, usando OBJECT_NAME() no era necesario porque sys.objects ya devuelve el nombre del objeto.

El siguiente ejemplo muestra dónde OBJECT_NAME() puede ser útil.

Ejemplo 2:un ejemplo más útil

En este ejemplo, devuelvo información sobre una clave externa consultando sys.foreign_keys vista del catálogo del sistema.

Primero, seleccionemos todas las columnas para ver qué devuelve esta vista:

USE Music;
SELECT * 
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Resultado (usando salida 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

Esta vista devuelve el nombre de la clave externa, pero no el nombre de su objeto principal. Tampoco devuelve el nombre del objeto referenciado de la clave foránea. Solo devuelve la ID de esos objetos (es decir, parent_object_id y referenced_object_id ).

Entonces, si tuviéramos que reducirlo a solo esas columnas, obtendríamos algo como esto:

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             |
+--------------------+--------------------+------------------------+

Afortunadamente, podemos pasar las dos últimas columnas a OBJECT_NAME() para recuperar los nombres de los objetos.

Esto es lo que podemos hacer para devolver los nombres.

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 las dos últimas columnas, paso los valores relevantes a OBJECT_NAME() para que devuelva el nombre de cada objeto padre.

Ejemplo 3:uso de OBJECT_NAME() en una cláusula WHERE

Aquí hay un ejemplo del uso de OBJECT_NAME() en un 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 bases de datos

De forma predeterminada, SQL Server asume que el ID de objeto está en el contexto de la base de datos actual. Una consulta que hace referencia a un ID en otra base de datos devuelve NULL o resultados incorrectos.

Si necesita encontrar un nombre de objeto de una base de datos diferente, puede proporcionar la ID de esa base de datos como segundo argumento al llamar a OBJECT_NAME() .

Consulte Cómo obtener un OBJECT_NAME() de una base de datos diferente en SQL Server para ver ejemplos.