假设我想检查两个不同系统/数据库之间的数据,如下所示:
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-server,另一个使用oracle)。
如何在c#中执行此选择命令?
答案 0 :(得分: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的第二个选项可以节省一些时间和性能。
答案 1 :(得分:0)
为什么不对数据库进行两次不同的调用,一次调用sql db,另一次调用oracle,之后内连接数据表?
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
};