2010-11-03 35 views
61

Mientras estoy en Management Studio, intento ejecutar una consulta/hacer una unión entre dos servidores vinculados. ¿Es esta una sintaxis correcta utilizando los servidores de base de datos vinculados:SQL Server Linked Server Ejemplo de consulta

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

Básicamente, es lo que acaba de prefacio, el nombre del servidor db a la db.table?

Respuesta

132

El formato probablemente debería ser:

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

Por ejemplo: DatabaseServer1.db1.dbo.table1


actualización: Sé que esto es una vieja pregunta y la respuesta que tener es correcto; Sin embargo, creo que cualquier persona que tropiece con esto debería saber algunas cosas.

Es decir, cuando se consulta en un servidor vinculado en una situación de unirse a la TODA tabla desde el servidor vinculado se probable ser descargados en el servidor se ejecuta la consulta con el fin de hacer la operación de unión. En el caso del OP, tanto table1 de DB1 como table1 de DB2 se transferirán en su totalidad al servidor que ejecuta la consulta, supuestamente llamado DB3.

Si tiene tablas grandes, este puede dar como resultado una operación que tarda mucho tiempo en ejecutarse. Después de todo, ahora está restringido por velocidades de tráfico de red que son órdenes de magnitud más lentas que la memoria o incluso velocidades de transferencia de disco.

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

No es posible, entonces necesita ver las diversas cosas que harían que el servidor SQL tenga que cargar toda la tabla localmente. Por ejemplo, usando GETDATE() o incluso ciertas uniones. Otros asesinos de rendimiento incluyen no dar los derechos apropiados.

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

+9

si el databas nombre de servidor tiene un guión, necesita rodearlo con corchetes – bmw0128

+4

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

+1

También necesita usar los corchetes o comillas dobles cuando el nombre del servidor de la base de datos tiene un punto. –

8

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

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

la sintaxis de unió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 cruzada de productos cuando tiene sus tablas y se une en dos lugares diferentes. –

+0

Tenga en cuenta que las partes de cuatro puntos NO FUNCIONA para algunos servidores vinculados que no sean servidores de SQL. 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

7

Si todavía encuentra problema con ...

nombre del servidor encierro entre []

+0

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

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

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

para comprobar si hay servidores vinculados llaman:

EXEC sys.sp_linkedservers 
+0

Esto NO FUNCIONA para algunos servidores vinculados que no son servidores de SQL. Se genera un error como ... Se especificó un esquema o catálogo no válido para el proveedor "MSDASQL" para el servidor vinculado "MyLinkedServer". – brewmanz

1

consultas directas Por lo general, no se deben utilizar en caso de servidor vinculado en gran medida debido a que utilice la base de datos de temperatura del servidor SQL.En el primer paso, los datos se recuperan en temp DB y luego se filtra. Hay muchos hilos sobre esto. Es mejor utilizar OPENQUERY abierta porque pasa SQL al servidor vinculado fuente y luego devuelve los resultados filtrados, p.

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

Esta respuesta no incluye un nombre de base de datos –

+2

Proporcioné información de la base de datos al crear el servidor vinculado. Para detalles, puede ver a continuación el enlace de MSDN: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx –

+0

¿Qué puedo hacer si mi servidor vinculado requiere autenticación y yo? Estoy tratando de consultar desde mi aplicación PHP usando PDO? – nekiala

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

Esto puede ayudarle.

+0

Upvoted. Esto funciona cuando vincula MySQL a MS SQL. –

+1

En otras palabras, esto está creando una consulta de paso a través. Tenga en cuenta que la declaración de consulta debe escribirse en el SQL nativo del servidor. La sintaxis de Oracle es diferente de Teradata diferente de SQL Server, etc. – AxGryndr

3

Para aquellos que tienen problemas con estas otras respuestas, tratar OPENQUERY

Ejemplo:

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

Funciona para SQL Server –

0

Por lo que vale la pena, me encontré con la siguiente sintaxis para trabajar lo mejor:

SELECT * FROM [LINKED_SERVER] ... [TABLA]

No pude obtener las recomendaciones de otros s para trabajar, usando el nombre de la base de datos. Además, esta fuente de datos no tiene esquema.

1
select name from drsql01.test.dbo.employee 
  • drslq01 es Serer --linked servernmae
  • prueba es el nombre de base de datos
  • DBO es -default esquema esquema
  • empleado es el nombre de tabla

espero que ayude a entender, cómo ejecutar la consulta para el servidor vinculado