Você já se perguntou por que usa-se um ponto duplo (“..”) para acessar uma tabela de outro banco de dados no SQL Server?

USE BD1
GO
SELECT * FROM BD2..TABELA

Já vi algumas pessoas questionarem e acho que a primeira reação é supor que seja uma espécie de operador especial.

Bem, para entender isso é preciso saber que um objeto (como uma tabela) no SQL Server possui uma identificação assim:

Servidor.BancoDeDados.Schema.Objeto

Com relação ao Schema, as pessoas criam geralmente todos os objetos no Schema padrão, o dbo. Como os objetos estão no mesmo Schema, especificá-lo é opcional.

Mas, quando esquecemos do “.dbo” nos CREATEs e outras DDLs, é bem provável termos problemas no futuro, pois o Schema padrão do usuário utilizado para executar scripts no cliente pode ser diferente. Já vi casos onde metade dos objetos ficavam num Schema e metade em outro.

Então, se você quer acessar uma tabela e está no mesmo servidor, usando (USE) o mesmo banco de dados e o mesmo Schema, poderá omitir todos estes utilizar apenas o nome da tabela:

SELECT * FROM Objeto

Agora vamos supor que você esteja usando (USE) um banco chamado BD1. Como faríamos para acessar uma tabela de um BD2? Seria tão simples como o exemplo abaixo?

USE BD1
GO
SELECT * FROM BD2..Objeto

A resposta é: depende!

Se os dois objetos não estiverem no mesmo Schema, então você deveria especificar o schema entre os dois pontos, assim:

USE BD1
GO
SELECT * FROM BD2.dbo.Objeto

Portanto, os dois pontos (“..”) seguidos significam que você está omitindo o Schema e solicitando ao SQL Server que utilize o padrão para o seu usuário.

Simples assim.