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

Cómo usar OBJECT_ID() en objetos de bases de datos cruzadas en SQL Server

Una diferencia entre OBJECT_ID() y OBJECT_NAME() en SQL Server es la sintaxis utilizada para consultas entre bases de datos. Con esto quiero decir, cuando se usan en objetos en una base de datos diferente.

El OBJECT_NAME() La función tiene un argumento opcional que puede proporcionar, que especifica el ID de la base de datos que contiene el objeto del que está tratando de obtener el nombre. Proporcionar este argumento le permite obtener el nombre de un objeto en una base de datos diferente.

El OBJECT_ID() Por otro lado, la función no requiere tal argumento. En cambio, esta función le permite usar un nombre de 3 partes para especificar la base de datos, el esquema y el nombre del objeto del que está tratando de obtener la ID.

Este artículo contiene ejemplos del uso de OBJECT_ID() para obtener el nombre de un objeto de una base de datos diferente.

Ejemplo 1:consulta básica

Aquí hay un ejemplo básico para demostrar cómo funciona.

USE WideWorldImportersDW;
SELECT OBJECT_ID('Music.dbo.Artists') AS Result;

Resultado:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Aquí, cambié a WideWorldImportersDW base de datos, luego consultó el nombre de un objeto en la Music base de datos.

Ejemplo 2:comparación con la base de datos actual

De forma predeterminada, SQL Server asume que el nombre del objeto está en el contexto de la base de datos actual. Entonces, si no usa un nombre de 3 partes para especificar un objeto en una base de datos diferente, el Motor de base de datos de SQL Server solo buscará en la base de datos actual.

Aquí está el mismo código del ejemplo anterior, excepto que esta vez incluyo nombres de 1 parte y 2 partes. Además, ejecuto el código dos veces:la primera vez que se ejecuta en Music base de datos, la segunda vez que se ejecuta en el WideWorldImportersDW base de datos:

USE Music;
SELECT 
  OBJECT_ID('Artists') AS [1 Part Name],
  OBJECT_ID('dbo.Artists') AS [2 Part Name],
  OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];

USE WideWorldImportersDW;
SELECT 
  OBJECT_ID('Artists') AS [1 Part Name],
  OBJECT_ID('dbo.Artists') AS [2 Part Name],
  OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];

Resultado:

Changed database context to 'Music'.
+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| 885578193     | 885578193     | 885578193     |
+---------------+---------------+---------------+
(1 row affected)
Changed database context to 'WideWorldImportersDW'.
+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| NULL          | NULL          | 885578193     |
+---------------+---------------+---------------+
(1 row affected)

En el primer resultado, las tres columnas devuelven el ID correcto. Esto se debe a que la base de datos actual es Music , y ahí es donde reside el objeto.

En el segundo resultado, solo el nombre de 3 partes puede encontrar el objeto correcto. Esto es de esperar, porque los nombres de 1 y 2 partes no especifican el nombre de la base de datos, por lo que se supone que el objeto está en WideWorldImportersDW base de datos (incorrecta).

Si ambas bases de datos tuvieran un objeto de ámbito de esquema llamado Artists entonces podríamos haber obtenido un resultado diferente. En tales casos, sería fácil suponer erróneamente que el resultado es correcto cuando en realidad no lo es.