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á.