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

Como usar OBJECT_ID() em objetos entre bancos de dados no SQL Server


Uma diferença entre OBJECT_ID() e OBJECT_NAME() no SQL Server é a sintaxe usada para consultas entre bancos de dados. Com isso quero dizer, quando eles são usados ​​em objetos em um banco de dados diferente.

O OBJECT_NAME() A função tem um argumento opcional que você pode fornecer, que especifica o ID do banco de dados do banco de dados que contém o objeto do qual você está tentando obter o nome. Fornecer esse argumento permite obter o nome de um objeto em um banco de dados diferente.

O OBJECT_ID() função, por outro lado, não requer tal argumento. Em vez disso, essa função permite que você use um nome de 3 partes para especificar o banco de dados, o esquema e o nome do objeto do qual você está tentando obter o ID.

Este artigo contém exemplos de uso de OBJECT_ID() para obter o nome de um objeto de um banco de dados diferente.


Exemplo 1 – Consulta básica


Aqui está um exemplo básico para demonstrar como funciona.
USE WideWorldImportersDW;
SELECT OBJECT_ID('Music.dbo.Artists') AS Result;

Resultado:
+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Aqui, mudei para o WideWorldImportersDW banco de dados, então consultou o nome de um objeto no Music base de dados.

Exemplo 2 – Comparado com o banco de dados atual


Por padrão, o SQL Server assume que o nome do objeto está no contexto do banco de dados atual. Portanto, se você não usar um nome de 3 partes para especificar um objeto em um banco de dados diferente, o Mecanismo de Banco de Dados do SQL Server só procurará no banco de dados atual.

Aqui está o mesmo código do exemplo anterior, exceto que desta vez eu incluo nomes de 1 e 2 partes. Além disso, eu executo o código duas vezes:a primeira vez que é executado no Music banco de dados, a segunda vez que é executado no WideWorldImportersDW base de dados:
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)

No primeiro resultado, todas as três colunas retornam o ID correto. Isso ocorre porque o banco de dados atual é Music , e é aí que o objeto reside.

No segundo resultado, apenas o nome de 3 partes é capaz de encontrar o objeto correto. Isso é esperado, porque os nomes de 1 parte e 2 partes não especificam o nome do banco de dados, portanto, assume que o objeto está no WideWorldImportersDW banco de dados (errado).

Se ambos os bancos de dados tivessem um objeto com escopo de esquema chamado Artists então poderíamos ter obtido um resultado diferente. Nesses casos, seria fácil supor erroneamente que o resultado está correto quando na verdade não está.