Como posso selecionar dados na mesma consulta de dois bancos de dados diferentes que estão em dois servidores diferentes no SQL Server?
Como posso selecionar dados na mesma consulta de dois bancos de dados diferentes que estão em dois servidores diferentes no SQL Server?
Respostas:
O que você está procurando são servidores vinculados. Você pode acessá-los no SSMS no seguinte local na árvore do Pesquisador de Objetos:
Server Objects-->Linked Servers
ou você pode usar sp_addlinkedserver .
Você só precisa configurar um. Depois disso, você pode chamar uma tabela no outro servidor da seguinte maneira:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Observe que o proprietário nem sempre é dbo
, portanto, substitua-o por qualquer esquema que você use.
[OtherServerName].[OtherDB]..[OtherTable]
entanto, é melhor incluí-lo, se conhecido.
Você pode fazer isso usando o servidor vinculado.
Normalmente, os servidores vinculados são configurados para permitir que o Mecanismo de Banco de Dados execute uma instrução Transact-SQL que inclua tabelas em outra instância do SQL Server ou em outro produto de banco de dados, como Oracle. Muitos tipos de fontes de dados OLE DB podem ser configurados como servidores vinculados, incluindo Microsoft Access e Excel.
Servidores vinculados oferecem as seguintes vantagens:
Leia mais sobre servidores vinculados .
Objetos de servidor -> servidores vinculados -> novo servidor vinculado
Forneça o nome do servidor remoto.
Selecione Tipo de servidor remoto (SQL Server ou Outro).
Selecione Segurança -> Ser criado usando este contexto de segurança e forneça login e senha do servidor remoto.
Clique em OK e pronto!
Aqui está um tutorial simples para criar um servidor vinculado.
OU
Você pode adicionar um servidor vinculado usando a consulta.
Sintaxe:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Leia mais sobre sp_addlinkedserver .
Você precisa criar um servidor vinculado apenas uma vez . Após criar o servidor vinculado, podemos consultá-lo da seguinte forma:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Você também pode examinar o uso de servidores vinculados. Servidores vinculados também podem ser outros tipos de fontes de dados, como plataformas DB2. Este é um método para tentar acessar o DB2 a partir de uma chamada SQL Server TSQL ou Sproc ...
Could not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
Consultar dois bancos de dados diferentes é uma consulta distribuída. Aqui está uma lista de algumas técnicas, além dos prós e contras:
tente isto:
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
Todas essas são boas respostas, mas essa está faltando e tem seus próprios usos poderosos. Possivelmente, não se encaixa no que o OP queria, mas a pergunta era vaga e acho que outras pessoas podem encontrar o caminho até aqui. Basicamente, você pode usar 1 janela para executar simultaneamente uma consulta em vários servidores. Veja como:
Em SSMS abrir Servidores Registrados e criar um novo grupo de servidor sob grupos locais do servidor .
Nesse grupo, crie Novo Registro de Servidor para cada servidor que você deseja consultar. Se os nomes do banco de dados forem diferentes, defina um padrão para cada um nas propriedades.
Agora volte ao grupo que você criou na primeira etapa, clique com o botão direito do mouse e selecione Nova consulta. Uma nova janela de consulta será aberta e qualquer consulta que você executar será executada em cada servidor do grupo. Os resultados são apresentados em um único conjunto de dados com um nome de coluna extra, indicando de qual servidor o registro veio. Se você usar a barra de status, notará que o nome do servidor é substituído por vários .
Eu tive o mesmo problema para conectar um SQL_server 2008 a um SQL_server 2016 hospedado em um servidor remoto. Outras respostas não funcionaram para mim diretamente. Escrevo aqui minha solução aprimorada, pois acho que pode ser útil para outra pessoa.
Uma resposta estendida para conexões IP db remotas:
Etapa 1: vincular servidores
EXEC sp_addlinkedserver @server='SRV_NAME',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'aaa.bbb.ccc.ddd';
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'
... onde SRV_NAME
é um nome inventado. Nós o usaremos para nos referir ao servidor remoto a partir de nossas consultas. aaa.bbb.ccc.ddd
é o endereço IP do servidor remoto que hospeda seu banco de dados SQLserver.
Etapa 2: execute suas consultas Por exemplo:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...e é isso!
Detalhes da sintaxe: sp_addlinkedserver e sp_addlinkedsrvlogin
Criou uma definição de servidor vinculado em um servidor para outro (você precisa do SA para fazer isso) e, em seguida, apenas faça referência a elas com nomes de quatro partes (consulte BOL).
Server 2008:
Quando estiver no SSMS conectado ao server1.DB1 e tente:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
como outros observaram, se não funcionar, é porque o servidor não está vinculado.
Eu recebo o erro:
Não foi possível encontrar o servidor DB2 em sys.servers. Verifique se o nome do servidor correto foi especificado. Se necessário, execute o procedimento armazenado sp_addlinkedserver para adicionar o servidor ao sys.servers.
Para adicionar o servidor:
referência: Para adicionar servidor usando sp_addlinkedserver Link: [1]: Para adicionar servidor usando sp_addlinkedserver
Para ver o que está em seus sys.servers, basta consultá-lo:
SELECT * FROM [sys].[servers]
Como @ Super9 falou sobre o OPENDATASOURCE usando a Autenticação do SQL Server com o provedor de dados SQLOLEDB . Estou apenas postando aqui um trecho de código para uma tabela no banco de dados atual do servidor em que o código está sendo executado e outra no outro servidor '192.166.41.123'
SELECT top 2 * from dbo.tblHamdoonSoft tbl1 inner JOIN
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id
Sei que essa é uma pergunta antiga, mas uso sinônimos. Supostamente, a consulta é executada no servidor de banco de dados A e procura uma tabela em um servidor de banco de dados B que não existe no servidor A. Adicione um sinônimo no banco de dados A que chama sua tabela do servidor B. Sua consulta não precisa ser inclua esquemas ou nomes diferentes de bancos de dados, basta chamar o nome da tabela normalmente e ele funcionará.
Não há necessidade de vincular servidores, pois os sinônimos, por assim dizer, são uma espécie de vinculação.
Solução simplificada para adicionar servidores vinculados
Primeiro servidor
EXEC sp_addlinkedserver @server='ip,port\instancename'
Segundo Login
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Executar consultas vinculadas ao banco de dados local
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]