Pesquisa de exemplo do servidor ligado ao SQL
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
basicamente, prefacias o nome do servidor db para o db.mesa ?
11 answers
O formato deve ser provavelmente:
<server>.<database>.<schema>.<table>
Por exemplo: Databaserver1.db1.dbo.quadro 1
Update : Eu sei que esta é uma pergunta antiga e a resposta que eu tenho é correta; no entanto, eu acho que qualquer outro tropeçando sobre isso deve saber algumas coisas.
Ou seja, quando se questiona um servidor ligado numa situação de junção, a tabela inteira do servidor ligado irá provavelmente ser transferida para o servidor a pesquisa está a ser executada a partir de in ordem para fazer a operação de adesão. No caso do OP, ambos table1
de DB1
e table1
de DB2
serão transferidos na sua totalidade para o servidor que executa a consulta, presumivelmente chamado DB3
.
Se tiver tabelas grandes, isto Pode {[15] } resultar numa operação que leva muito tempo a ser executada. Afinal de contas, ele é agora restringido por velocidades de tráfego de rede que são ordens de magnitude mais lento do que a memória ou mesmo Velocidade de transferência de disco.
Se possível, efectuar uma única consulta contra o servidor remoto, sem se juntar a uma tabela local, para puxar os dados que você precisa para uma tabela temporária. Então questiona isso.
Isso não é possível então você precisa olhar para as várias coisas que fariam o servidor SQL ter que carregar toda a tabela localmente. Por exemplo, usando GETDATE()
ou mesmo certas ligações. Outros assassinos de desempenho incluem não dar direitos adequados.
Ver http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ para mais informações.
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Isto pode ajudar-te.
Se ainda tiver problemas com <server>.<database>.<schema>.<table>
Anexar o nome do servidor em []
Tem de indicar o esquema/proprietário (dbo por omissão) como parte da referência. Além disso, seria preferível usar o estilo de junção mais recente (ANSI-92).
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
Para aqueles que têm problemas com essas outras respostas , tente OPENQUERY
Exemplo:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
select * from [Server].[database].[schema].[tablename]
Esta é a maneira correcta de ligar.
Certifique-se de verificar se os servidores estão ligados antes de executar a consulta!
Para verificar se há servidores ligados, ligue para:
EXEC sys.sp_linkedservers
Normalmente, as consultas directas não devem ser usadas no caso de servidor ligado porque usa fortemente a base de dados temp do servidor SQL. Na primeira etapa os dados são recuperados em DB de temperatura, em seguida, a filtragem ocorrer. Há muitos fios sobre isso. É melhor usar o OPENQUERY aberto porque passa o SQL para o servidor ligado à fonte e depois devolve os resultados filtrados, por exemplo
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
select name from drsql01.test.dbo.employee
- drslq01 is servernmae -- linked serer
- o teste é o nome da base de dados
- dbo is schema-default schema
- o empregado é o nome do quadro
Espero que ajude a compreender, como executar a consulta para o servidor ligado
Seguir a consulta é o melhor trabalho.
Tente esta consulta:
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
Ajuda muito ligar o MySQL ao MS SQL
Para que conste, encontrei a seguinte sintaxe para trabalhar o melhor:
SELECCIONE * DE [LINKED_SERVER]...[Quadro]
Não consegui que as recomendações dos outros funcionassem, usando o nome da base de dados. Além disso, esta fonte de dados não tem nenhum esquema.