Consulta de ejemplo de servidor vinculado de SQL Server


93

Mientras estoy en Management Studio, estoy tratando de ejecutar una consulta / hacer una combinación entre dos servidores vinculados. ¿Es esta una sintaxis correcta usando servidores de base de datos vinculados?

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

Básicamente, ¿simplemente antepone el nombre del servidor db a db.table?

Respuestas:


186

El formato probablemente debería ser:

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

Por ejemplo: DatabaseServer1.db1.dbo.table1


Actualización : sé que esta es una pregunta antigua y la respuesta que tengo es correcta; sin embargo, creo que cualquier otra persona que se encuentre con esto debería saber algunas cosas.

Es decir, cuando se consulta contra un servidor vinculado en una situación de combinación, la tabla COMPLETA del servidor vinculado probablemente se descargará al servidor desde el que se ejecuta la consulta para realizar la operación de combinación. En el caso del OP, tanto table1desde DB1como table1desde DB2se transferirán en su totalidad al servidor que ejecuta la consulta, presumiblemente nombrado DB3.

Si tiene mesas grandes, esto puede resultar en una operación que tarda mucho en ejecutarse. Después de todo, ahora está limitado por las velocidades de tráfico de la red, que son órdenes de magnitud más lentas que las velocidades de transferencia de la memoria o incluso del disco.

Si es posible, realice una única consulta en el servidor remoto, sin unirse a una tabla local, para extraer los datos que necesita en una tabla temporal. Entonces consulta fuera de eso.

Si eso no es posible, debe observar las diversas cosas que harían que el servidor SQL tuviera que cargar toda la tabla localmente. Por ejemplo, utilizando GETDATE()o incluso determinadas combinaciones. Otros asesinos del desempeño incluyen no otorgar los derechos apropiados.

Consulte http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ para obtener más información.


11
si el nombre del
servidor de

4
@ bmw0128: Mejor aún, use comillas dobles: es compatible con casi todas las plataformas, a diferencia de los corchetes de Microsoft.

2
También debe usar los corchetes o comillas dobles cuando el nombre del servidor de la base de datos tiene un punto.
David Brunow

4
Si no está seguro acerca de alguno de los calificadores, acceda a una tabla en un servidor vinculado en el Explorador de objetos SSMS, haga clic con el botón derecho y seleccione Tabla de secuencia de comandos como, SELECCIONAR para y Nueva ventana del editor de consultas. La instrucción SELECT resultante incluirá la ruta correcta y completamente calificada a la tabla. Tenía un calificador de base de datos misterioso al trabajar con Sybase y esto me dio el nombre correcto.
John Mo

Creo que se equivoca al decir que se transferirá toda la mesa. ¿Puede proporcionar alguna referencia de dónde obtuvo esa información? Intenté unirme a una tabla con 204 millones de filas (datos de 16 GB, índice de 6,6 GB) en un servidor vinculado y me tomó 47 ms enlazar con 5 de las filas, 7 ms en la segunda consulta ya que presumiblemente los datos estaban almacenados en caché. ¿Quizás si su unión requiriera un escaneo de tabla en la tabla vinculada, tendría que transferirlo todo?
Jason Goemaat

32
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

Esto puede ayudarte.


Voto a favor. Esto funciona cuando está vinculando MySQL a MS SQL.
Baz Guvenkaya

3
En otras palabras, se trata de crear una consulta de paso. Tenga en cuenta que la declaración de consulta debe escribirse en el SQL nativo del servidor. La sintaxis para Oracle es diferente a Teradata diferente a SQL Server, etc.
AxGryndr

10

Si aún encuentra problemas con <server>.<database>.<schema>.<table>

Incluya el nombre del servidor en []


Cuidado: ejecuté una tabla de creación desde seleccionar usando [], y en lugar de crearse en el servidor vinculado, la tabla se creó localmente con un nombre comodbo.databaseserver1.db1.dbo.table1
biscuit314

9

Para aquellos que tienen problemas con estas otras respuestas , intenteOPENQUERY

Ejemplo:

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

Funciona para SQL Server
Tom Stickel

8

Debe especificar el esquema / propietario (dbo por defecto) como parte de la referencia. Además, sería preferible utilizar el estilo de combinación más reciente (ANSI-92).

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

la sintaxis de combinación interna es preferible a las combinaciones implícitas?
bmw0128

2
@ bmw0128: Sí, por varias razones. En mi humilde opinión, lo más importante es que es demasiado fácil escribir accidentalmente una combinación de productos cruzados cuando tienes tus tablas y combinaciones en dos lugares diferentes.

Tenga en cuenta que las partes de 4 puntos NO FUNCIONAN para algunos servidores vinculados que no son de SQL Server. Puede generar un error como ... Se especificó un esquema o catálogo no válido para el proveedor "MSDASQL" para el servidor vinculado "MyLinkedServer".
brewmanz

6
select * from [Server].[database].[schema].[tablename] 

Esta es la forma correcta de llamar. ¡Asegúrese de verificar que los servidores estén vinculados antes de ejecutar la consulta!

Para verificar si hay servidores vinculados, llame a:

EXEC sys.sp_linkedservers 

Esto NO FUNCIONA para algunos servidores no vinculados a SQL Server. Genera un error como ... Se especificó un esquema o catálogo no válido para el proveedor "MSDASQL" para el servidor vinculado "MyLinkedServer".
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 es servernmae: seridor vinculado
  • prueba es el nombre de la base de datos
  • dbo es esquema -esquema predeterminado
  • empleado es el nombre de la mesa

Espero que ayude a comprender cómo ejecutar la consulta para el servidor vinculado


2

Por lo general, las consultas directas no deben usarse en el caso de un servidor vinculado porque usa mucho la base de datos temporal del servidor SQL. En el primer paso, los datos se recuperan en la base de datos temporal y luego se realiza el filtrado. Hay muchos hilos sobre esto. Es mejor usar OPENQUERY abierto porque pasa SQL al servidor vinculado de origen y luego devuelve resultados filtrados, por ejemplo

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

Esta respuesta no incluye un nombre de base de datos
Chris Nevill

2
He proporcionado información de la base de datos al crear el servidor vinculado. Para obtener más detalles, puede ver el enlace de MSDN a continuación: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

¿Qué puedo hacer si mi servidor vinculado requiere autenticación y solo estoy tratando de realizar consultas desde mi aplicación PHP usando PDO?
nekiala

¿Cómo realizaría una unión desde la base de datos 1 a la base de datos en el servidor vinculado, utilizando este enfoque?
eaglei22

2

Por lo que vale, encontré que la siguiente sintaxis funciona mejor:

SELECCIONAR * DE [LINKED_SERVER] ... [TABLE]

No pude hacer que las recomendaciones de otros funcionen, usando el nombre de la base de datos. Además, esta fuente de datos no tiene esquema.


2

haga clic derecho en una tabla y haga clic en la tabla de secuencia de comandos como seleccione

ingrese la descripción de la imagen aquí


Eso no es lo que pidió el OP
Fandango68

2
esto muestra cómo obtener la sintaxis correcta para la consulta de selección en una tabla vinculada. el resultado es como la respuesta de Seans
Shimon Doodkin

1
@ShimonDoodkin, un excelente ejemplo de no me des un pescado, pero enséñame a pescar
Amro

0

La siguiente consulta funciona mejor.

Prueba esta consulta:

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

Es muy útil vincular MySQL a MS SQL


0

PostgreSQL :

  1. Debe proporcionar un nombre de base de datos en el DSN de origen de datos .
  2. Ejecute Management Studio como administrador
  3. Debe omitir el DBName de la consulta :

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.