Запрос данных путем объединения двух таблиц в две базы данных на разных серверах


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

10 77

10 ответов:

вам понадобится sp_addlinkedserver создать сервер. Смотрите документация для использования. Как только связь с сервером будет установлена, вы создадите запрос как обычно, просто префикс имени базы данных с другим сервером. То Есть:

-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
        ON tab1.ID = tab2.ID

после того, как ссылка установлена, вы также можете использовать OPENQUERY для выполнения инструкции SQL на удаленном сервере и передачи только данных обратно к вам. Это может быть немного быстрее, и это позволит удаленному серверу оптимизируйте свой запрос. Если вы кэшируете данные во временной (или в памяти) таблице на DB1 в приведенном выше примере, то вы сможете запросить его просто как присоединение к стандартной таблице. Например:

-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')

-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID

Проверьте документация для OPENQUERY посмотреть еще несколько примеров. Приведенный выше пример довольно надуманный. Я бы определенно использовал первый метод в этом конкретном примере, но второй вариант с использованием OPENQUERY может сэкономить некоторое время и производительность, если вы используете запрос для фильтрации некоторых данных.

попробуйте это:

SELECT tab2.column_name  
FROM  [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2]  tab2   
    ON tab1.col_name = tab2.col_name

Если связанный сервер не разрешен вашим dba, вы можете использовать OPENROWSET. Онлайн-книги предоставят вам необходимый синтаксис.

с практической точки зрения предприятия, лучше всего сделать зеркальную копию таблицы базы данных в вашей базе данных, а затем просто иметь задачу/proc обновить его с delta каждый час.

соединение двух таблиц лучше всего сделать с помощью СУБД, поэтому это должно быть сделано таким образом. Вы можете отразить меньшую таблицу или ее подмножество в одной из баз данных, а затем присоединиться к ним. Можно было бы соблазниться сделать это на сервере ETL, таком как informatica, но я думаю, что это не рекомендуется, если таблицы огромны.

Если опция ссылка на базу данных недоступна, другой маршрут, который вы можете предпринять, - это связать таблицы через ODBC с чем-то вроде MS Access или Crystal reports и выполнить соединение там.

я попробовал этот код ниже, и он работает нормально

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID

вы можете попробовать следующее:

select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country
from customer1
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd
on customer1.Id=CustAdd.CustId

возможно, жестко закодированные имена баз данных-это не лучший подход всегда в SQL-запросе. Таким образом, добавление синонимов было бы лучшим подходом. Не всегда базы данных имеют одно и то же имя в нескольких промежуточных средах. Они могут состоять из постфиксов, таких как PROD, UAT, SIT, QA и т. д. Так что будьте в курсе жестко запросов и сделать их более динамичными.

подход №1: используйте синонимы для связи таблиц между базами данных на одном сервере.

подход #2: Соберите данные отдельно от каждой базы данных и присоедините их к своему коду. Строки подключения к базе данных могут быть частью конфигурации сервера приложений через базу данных или файл конфигурации.

для этого просто следуйте ниже запрос

select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id

где я написал databasename, вы должны определить имя базы данных. Если вы находитесь в той же базе данных, поэтому вам не нужно определять имя базы данных, но если вы находитесь в другой базе данных, вы должны указать имя базы данных в качестве пути или он покажет вам ошибку. Надеюсь, что я сделал вашу работу легко