Объединение таблиц с разных серверов - PullRequest
9 голосов
/ 06 января 2012

Любые предложения, как объединить таблицы с разных серверов в хранимой процедуре?

Ответы [ 4 ]

13 голосов
/ 06 января 2012

Без подробностей трудно привести прямые примеры, но вот основная идея:

Во-первых, вне хранимой процедуры, хост-сервер (сервер, на котором будет храниться хранимая процедура) должензнать о втором сервере, включая (возможно) информацию для входа.

На вашем главном сервере запустите хранимую процедуру sp_addlinkedserver.Это нужно сделать только один раз:

exec sp_addlinkedserver @server=’(your second server)‘;

Если , вам необходимо предоставить информацию для входа на этот второй сервер (например, процесс не может войти в систему с теми же учетными данными, что ииспользуются в исходном соединении с базой данных), сделайте это с хранимой процедурой sp_addlinkedsrvlogin:

exec sp_addlinkedsrvlogin @rmtsrvname=’(your second server)‘,@useself=false, @rmtuser=’yourusername‘, @rmtpassword=’yourpassword‘;

Затем в своей хранимой процедуре вы можете указать таблицы на втором сервере:

SELECT table1.*
FROM table1
INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
    table1.joinfield = table2.joinfield
2 голосов
/ 10 ноября 2015

1. Проверьте, есть ли у вас какие-либо связанные серверы, использующие exec sp_helpserver

2. Если ваш сервер не возвращается, то это не Linked, то есть вам нужно будет добавить его. В противном случае перейти к шагу 3.

Для Sql Server 2008 R2 перейдите на Server Object > Linked Servers > Add new Linked Server

Или

exec sp_addlinkedserver @server='ServerName'; 

3. Подключиться к вторичному серверу как ...

exec sp_addlinkedsrvlogin 
@rmtsrvname='ServerName'
, @useself=false
, @rmtuser='user'
, @rmtpassword='Password';

4. Теперь вы можете объединить таблицы для двух разных серверов.

SELECT 
    SRV1.*
FROM 
    DB1.database_name.dbo.table_name SRV1
        INNER JOIN DB2.database_name.dbo.table_name SRV2
        ON SRV1.columnId = SRV2.columnId
GO
2 голосов
/ 06 января 2012

Вы должны сначала связать два сервера, прежде чем присоединяться к таблицам. Как только они связаны, вы можете просто использовать приведенный ниже запрос и заменить имена серверов, баз данных и таблиц.

Не забудьте выполнить приведенный ниже SQL в DB2:

EXEC sp_addlinkedserver DB1
GO

-- below statement connects sa account of DB2 to DB1
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'DB1', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'DB1 sa pwd'
GO

SELECT a.columns 
FROM DB1.database_name.dbo.table_name a
INNER JOIN DB2.database_name.dbo.table_name b
ON a.columnId = b.columnId
GO

Связывание серверов - http://msdn.microsoft.com/en-us/library/ms188279.aspx

0 голосов
/ 17 мая 2018

Вы можете написать запрос в соответствии с приведенным ниже синтаксисом, чтобы присоединиться к другому серверу в SQL Server.

SELECT table_1.*  
FROM [Database_1].[dbo].[Table_1] table_1
INNER JOIN  [IP_OF_SERVER_2].[Database_2].[dbo].[Table_2] table_2 ON table_1.tablekey COLLATE DATABASE_DEFAULT  = table_2.tablekey COLLATE DATABASE_DEFAULT

p / s: COLLATE DATABASE_DEFAULT для кодирования, Предотвратить нижеуказанную ошибку."в равной операции.

...