2016-01-31 2 views
1

Предположим, я хочу, чтобы проверить данные между 2 различными системами/базами данных, как показано ниже:строка соединения для чтения из различных баз данных в C#

select CLIENT1.CLIENTNAME AS CLIENTNAME1, 
      CLIENT2.CLIENTNAME AS CLIENTNAME2 
from  [System1-Database]..CLIENT as CLIENT1 
left join [System2-Database]..CLIENT as CLIENT2 
on  CLIENT1.idclient=CLIENT2.idclient 

Проблема заключается в том, что у меня есть одна строка подключения для каждой системы/базы данных (один используя sql-сервер, а другой - с помощью oracle).

Как это сделать, чтобы сделать команду select в C#?

ответ

0

Чтобы создать ссылку на сервер, вам необходимо использовать 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 может сэкономить время и производительность, если вы используете запрос для фильтрации некоторых данных.

+0

И еще - включить специальные распределенные запросы на вашем MSSQL сервере и использовать строку подключения к оракулу непосредственно в OPENROWSET или OPENDATASOURCE https://msdn.microsoft.com/en-us/library/ms187569.aspx – vitalygolub

0

Почему бы не сделать два разных вызова в базе данных, один для sql db и другой для оракула, после этого внутреннего соединить таблицы данных?

DataTable oracleTbl = GetOracleData(); 
DataTable sqlTbl = GetSqlData(); 

var results = from oracleTbl in dt1.AsEnumerable() 
       join sqlTbl in dt2.AsEnumerable() on (Guid)sqlTbl ["ID"] equals (int)oracleTbl["ID"] 
       select new 
       { 
        //Select data you need 
       }; 
Смежные вопросы