Запрос данных путем объединения двух таблиц в две базы данных на разных серверах
есть две таблицы в двух разных баз данных на разных серверах, мне нужно присоединиться к ним, чтобы сделать несколько запросов. Какие у меня есть варианты? Что же мне делать?
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, вы должны определить имя базы данных. Если вы находитесь в той же базе данных, поэтому вам не нужно определять имя базы данных, но если вы находитесь в другой базе данных, вы должны указать имя базы данных в качестве пути или он покажет вам ошибку. Надеюсь, что я сделал вашу работу легко