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.