Consulta de exemplo de servidor vinculado do SQL Server

93

Enquanto estou no Management Studio, estou tentando executar uma consulta / fazer uma junção entre dois servidores vinculados. Esta é uma sintaxe correta usando servidores db vinculados:

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

Basicamente, você apenas inicia o nome do servidor db para db.table?

bmw0128
fonte

Respostas:

186

O formato provavelmente deve ser:

<server>.<database>.<schema>.<table>

Por exemplo: DatabaseServer1.db1.dbo.table1


Update : Eu sei que esta é uma pergunta antiga e a resposta que tenho está correta; no entanto, acho que qualquer pessoa que tropeçar nisso deve saber algumas coisas.

Ou seja, ao consultar um servidor vinculado em uma situação de junção, a tabela INTEIRA do servidor vinculado provavelmente será baixada para o servidor a partir do qual a consulta está sendo executada para fazer a operação de junção. No caso do OP, tanto a table1partir DB1como a table1partir DB2serão transferidos em sua totalidade para o servidor que executa a consulta, presumivelmente denominado DB3.

Se você tiver tabelas grandes, isso pode resultar em uma operação que leva muito tempo para executar. Afinal, ele agora é limitado pelas velocidades de tráfego da rede, ordens de magnitude mais lentas do que as velocidades de memória ou mesmo de transferência de disco.

Se possível, execute uma única consulta no servidor remoto, sem ingressar em uma tabela local, para extrair os dados de que você precisa em uma tabela temporária. Em seguida, pergunte sobre isso.

Se isso não for possível, você precisa examinar as várias coisas que fariam com que o SQL server carregasse toda a tabela localmente. Por exemplo, usando GETDATE()ou mesmo certas associações. Outros assassinos de desempenho incluem não conceder direitos apropriados.

Consulte http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ para mais informações.

Eu não
fonte
11
se o nome do
servidor de
4
@ bmw0128: Melhor ainda, use aspas duplas: é compatível com quase todas as plataformas, ao contrário dos colchetes da Microsoft.
2
Você também precisa usar colchetes ou aspas duplas quando o nome do servidor de banco de dados contém um ponto.
David Brunow
4
Se você não tiver certeza sobre qualquer um dos qualificadores, faça uma busca detalhada em uma tabela em um Linked Server no SSMS Object Explorer, clique com o botão direito, e Script Table as, SELECT To, e New Query Editor Window. A instrução SELECT resultante incluirá o caminho correto e totalmente qualificado para a tabela. Eu tinha um qualificador de banco de dados misterioso ao trabalhar com o Sybase e ele me deu o nome correto.
John Mo
Acho que você está incorreto ao dizer que toda a mesa será transferida. Você pode fornecer alguma referência de onde obteve essas informações? Acabei de tentar ingressar em uma tabela com 204 milhões de linhas (dados de 16 GB, índice de 6,6 GB) em um servidor vinculado e demorou 47 ms para vincular a 5 das linhas, 7 ms na segunda consulta, pois os dados provavelmente foram armazenados em cache. Talvez se sua associação exigisse uma varredura de tabela na tabela vinculada, teria que transferir tudo?
Jason Goemaat
32
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

Isso pode te ajudar.

Akhilesh Kamate
fonte
Votado. Isso funciona quando você está vinculando o MySQL ao MS SQL.
Baz Guvenkaya
3
Em outras palavras, isso está criando uma consulta de passagem. Lembre-se de que a instrução de consulta deve ser escrita no SQL nativo do servidor. Sintaxe para Oracle sendo diferente de Teradata diferente de SQL Server etc.
AxGryndr
10

Se você ainda encontrar problemas com <server>.<database>.<schema>.<table>

Coloque o nome do servidor em []

Mian
fonte
Cuidado: Eu executei uma tabela de criação de select usando [] e, em vez de ser criada no servidor vinculado, a tabela foi criada localmente com um nome comodbo.databaseserver1.db1.dbo.table1
biscuit314
9

Para aqueles que estão tendo problemas com essas outras respostas , tenteOPENQUERY

Exemplo:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
Tom Stickel
fonte
Funciona para SQL Server
Tom Stickel
8

Você precisa especificar o esquema / proprietário (dbo por padrã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
Joe Stefanelli
fonte
a sintaxe de junção interna é preferível às junções implícitas?
bmw0128
2
@ bmw0128: Sim, por vários motivos. IMHO, o mais importante é que é muito fácil escrever acidentalmente uma junção de produto cruzado quando você tem suas tabelas e junções em dois lugares diferentes.
Observe que as partes de 4 pontos NÃO FUNCIONAM para alguns servidores vinculados que não são do SQL Server. Ele pode gerar um erro como ... Um esquema ou catálogo inválido foi especificado para o provedor "MSDASQL" para o servidor vinculado "MyLinkedServer".
brewmanz
6
select * from [Server].[database].[schema].[tablename] 

Esta é a forma correta de ligar. Certifique-se de verificar se os servidores estão vinculados antes de executar a consulta!

Para verificar se há servidores vinculados, chame:

EXEC sys.sp_linkedservers 
Abhishek Jaiswal
fonte
Isso NÃO FUNCIONA para alguns servidores não vinculados ao SQL Server. Ele gera um erro como ... Um esquema ou catálogo inválido foi especificado para o provedor "MSDASQL" para o servidor vinculado "MyLinkedServer".
brewmanz de
4
select name from drsql01.test.dbo.employee
  • drslq01 é servernmae - seridor vinculado
  • teste é o nome do banco de dados
  • dbo é esquema -esquema padrão
  • funcionário é o nome da mesa

Espero que ajude a entender como executar consulta para servidor vinculado

Jaspreet Singh
fonte
2

Normalmente, as consultas diretas não devem ser usadas no caso de servidor vinculado porque ele usa muito o banco de dados temporário do servidor SQL. Na primeira etapa, os dados são recuperados no banco de dados temporário, em seguida, ocorre a filtragem. Existem muitos tópicos sobre isso. É melhor usar o OPENQUERY aberto porque ele passa o SQL para o servidor vinculado de origem e retorna os resultados filtrados, por exemplo

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
Muhammad Yaseen
fonte
Esta resposta não inclui um nome de banco de dados
Chris Nevill
2
Eu forneci informações do banco de dados ao criar o servidor vinculado. Para obter detalhes, você pode ver o link do MSDN abaixo: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen
O que posso fazer se meu servidor vinculado exigir autenticação e eu estiver apenas tentando consultar meu aplicativo PHP usando PDO?
nekiala de
Como você realizaria uma junção do banco de dados 1 ao banco de dados no servidor vinculado, usando essa abordagem?
eaglei22
2

Pelo que vale a pena, descobri que a seguinte sintaxe funciona melhor:

SELECIONE * DE [LINKED_SERVER] ... [TABELA]

Não consegui fazer com que as recomendações de outras pessoas funcionassem, usando o nome do banco de dados. Além disso, esta fonte de dados não possui esquema.

Sean Warren
fonte
2

clique com o botão direito em uma tabela e clique na tabela de script como selecionar

insira a descrição da imagem aqui

Shimon Doodkin
fonte
Não foi isso que o OP perguntou
Fandango68
2
isso mostra como obter a sintaxe correta para a consulta selecionada em uma tabela vinculada. o resultado é como uma resposta seans
Shimon Doodkin
1
@ShimonDoodkin, um excelente exemplo de não me dê um peixe, mas me ensine a pescar
Amro
0

Seguir a Consulta é o melhor trabalho.

Experimente esta consulta:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

É muito útil vincular o MySQL ao MS SQL

Vijay S
fonte
0

PostgreSQL :

  1. Você deve fornecer um nome de banco de dados no DSN da fonte de dados .
  2. Execute Management Studio como Administrador
  3. Você deve omitir o DBName da consulta :

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')

Shadi Namrouti
fonte