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.