¿Cómo puedo seleccionar datos en la misma consulta de dos bases de datos diferentes que están en dos servidores diferentes en SQL Server?
¿Cómo puedo seleccionar datos en la misma consulta de dos bases de datos diferentes que están en dos servidores diferentes en SQL Server?
Respuestas:
Lo que está buscando son servidores vinculados. Puede acceder a ellos en SSMS desde la siguiente ubicación en el árbol del Explorador de objetos:
Server Objects-->Linked Servers
o puede usar sp_addlinkedserver .
Solo tienes que configurar uno. Una vez que tenga eso, puede llamar a una tabla en el otro servidor de la siguiente manera:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Tenga en cuenta que el propietario no siempre es dbo
así, así que asegúrese de reemplazarlo con el esquema que utilice.
[OtherServerName].[OtherDB]..[OtherTable]
, es mejor incluirlo si se conoce.
Puede hacerlo usando el servidor vinculado.
Por lo general, los servidores vinculados se configuran para permitir que el Motor de base de datos ejecute una instrucción Transact-SQL que incluya tablas en otra instancia de SQL Server u otro producto de base de datos como Oracle. Muchos tipos de fuentes de datos OLE DB se pueden configurar como servidores vinculados, incluidos Microsoft Access y Excel.
Los servidores vinculados ofrecen las siguientes ventajas:
Lea más sobre los servidores vinculados .
Objetos del servidor -> Servidores vinculados -> Nuevo servidor vinculado
Proporcione el nombre del servidor remoto.
Seleccione el tipo de servidor remoto (SQL Server u otro).
Seleccione Seguridad -> Realizar utilizando este contexto de seguridad y proporcione el inicio de sesión y la contraseña del servidor remoto.
Haga clic en Aceptar y ya está.
Aquí hay un tutorial simple para crear un servidor vinculado.
O
Puede agregar un servidor vinculado mediante la consulta.
Sintaxis:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Lea más sobre sp_addlinkedserver .
Debe crear un servidor vinculado solo una vez . Después de crear un servidor vinculado, podemos consultarlo de la siguiente manera:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
También puede ver el uso de servidores vinculados. Los servidores vinculados también pueden ser otros tipos de fuentes de datos, como las plataformas de DB2. Este es un método para intentar acceder a DB2 desde una llamada SQL Server TSQL o 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 en 2 bases de datos diferentes es una consulta distribuida. Aquí hay una lista de algunas técnicas más los pros y los contras:
prueba esto:
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 estas son buenas respuestas, pero esta falta y tiene sus propios usos poderosos. Posiblemente no se ajusta a lo que el OP quería, pero la pregunta era vaga y siento que otros pueden encontrar su camino aquí. Básicamente, puede usar 1 ventana para ejecutar simultáneamente una consulta en varios servidores, así es como:
En SSMS abrir Servidores registrados y crear un nuevo grupo de servidor bajo grupos locales del servidor .
En este grupo, cree un nuevo registro de servidor para cada servidor que desee consultar. Si los nombres de DB son diferentes, asegúrese de establecer un valor predeterminado para cada uno en las propiedades.
Ahora regrese al Grupo que creó en el primer paso, haga clic derecho y seleccione Nueva consulta. Se abrirá una nueva ventana de consulta y cualquier consulta que ejecute se ejecutará en cada servidor del grupo. Los resultados se presentan en un único conjunto de datos con un nombre de columna adicional que indica de qué servidor proviene el registro. Si usa la barra de estado, notará que el nombre del servidor se reemplaza por múltiple .
Tuve el mismo problema para conectar un SQL_server 2008 a un SQL_server 2016 alojado en un servidor remoto. Otras respuestas no me funcionaron directamente. Escribo mi solución ajustada aquí, ya que creo que puede ser útil para otra persona.
Una respuesta extendida para conexiones remotas de IP db:
Paso 1: enlace de 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'
... donde SRV_NAME
es un nombre inventado. Lo usaremos para referirnos al servidor remoto de nuestras consultas. aaa.bbb.ccc.ddd
es la dirección IP del servidor remoto que aloja su base de datos SQLserver.
Paso 2: Ejecute sus consultas Por ejemplo:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...¡y eso es!
Detalles de sintaxis: sp_addlinkedserver y sp_addlinkedsrvlogin
Creó una definición de servidor vinculado en un servidor al otro (necesita SA para hacer esto), luego simplemente haga referencia a ellos con nombres de 4 partes (vea BOL).
Servidor 2008:
Cuando esté en SSMS conectado al servidor1.DB1 e intente:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
como otros señalaron, si no funciona es porque el servidor no está vinculado.
Me sale el error:
No se pudo encontrar el servidor DB2 en sys.servers. Verifique que se haya especificado el nombre correcto del servidor. Si es necesario, ejecute el procedimiento almacenado sp_addlinkedserver para agregar el servidor a sys.servers.
Para agregar el servidor:
referencia: Para agregar el servidor usando sp_addlinkedserver Enlace: [1]: Para agregar el servidor usando sp_addlinkedserver
Para ver lo que hay en su servidor sys.servers solo consulte:
SELECT * FROM [sys].[servers]
Como @ Super9 contó sobre OPENDATASOURCE utilizando la autenticación de SQL Server con el proveedor de datos SQLOLEDB . Solo estoy publicando aquí un fragmento de código para una tabla en la base de datos del servidor actual donde se está ejecutando el código y otra en otro 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
Sé que esta es una vieja pregunta, pero uso sinónimos. Supuestamente, la consulta se ejecuta dentro del servidor de base de datos A, y busca una tabla en un servidor de base de datos B que no existe en el servidor A. Agregue luego un sinónimo en la base de datos A que llama a su tabla desde el servidor B. Su consulta no tiene que incluya esquemas o nombres de bases de datos diferentes, simplemente llame al nombre de la tabla de la forma habitual y funcionará.
No es necesario vincular servidores, ya que los sinónimos por ejemplo son una especie de enlace.
Objetos del servidor ---> servidor vinculado ---> nuevo servidor vinculado
En el servidor vinculado, escriba el nombre del servidor o la dirección IP para otro servidor y seleccione SQL Server In Security select (se debe hacer usando este contexto de seguridad) Escriba el nombre de usuario y la contraseña para otro servidor
Ahora conectado, luego use
Select * from [server name or ip addresses ].databasename.dbo.tblname
Solución simplificada para agregar servidores vinculados
Primer servidor
EXEC sp_addlinkedserver @server='ip,port\instancename'
Segundo inicio de sesión
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Ejecutar consultas vinculadas a db local
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]