2017-03-28 2 views
3

2 개의 다른 연결이 다른 SQL 서버, 원본 서버 및 대상 서버에 있습니다. 두 서버에있는 테이블을 비교하고 대상 서버 테이블을 원본 서버와 정렬하려고합니다.C#을 사용하는 2 개의 다른 sqlconnections가있는 1 개의 SQL

(select * from Source table) except (select * from Target table) 

또는 둘 다 연결에서 테이블을 사용하는 다른 SQL 쿼리 :

SqlConnection src = (DataBaseConnection.GetSqlConnection()); 

SqlConnection trg = new SqlConnection(Properties.Settings.Default.IDCConnectionDEV); 

src.Open(); 
trg.Open(); 

SqlCommand source = new SqlCommand("SELECT * FROM Source table", src); 
SqlCommand traget = new SqlCommand("SELECT * FROM Target Table", trg); 

SqlDataReader drsrc = source.ExecuteReader(); 
SqlDataReader drtrg = traget.ExecuteReader(); 

DataTable tbl1 = new DataTable(); 
tbl1.Load(drsrc); 

DataTable tbl2 = new DataTable(); 
tbl2.Load(drtrg); 

이제 내 질문에 내가 다음 쿼리를 실행합니까 방법이다.

+2

서버는 서로 링크를 볼 수 있다면 sp_addlinkedserver를 사용하여 한 서버를 다른 서버에 연결하면 해당 서버가 두 번째 서버를 직접 쿼리 할 수 ​​있습니다. ('select * from otherserver.dbname.dbo.sometable') –

+1

또는 데이터를 읽은 다음 linq을 사용하여 데이터를 필터링하십시오 – Pikoh

답변

0

서로 다른 연결에 있기 때문에 두 개의 서로 다른 데이터 테이블에서 SQL 문을 실행할 수 없습니다.

  1. 한 서버 또는 다른 서버에 연결된 서버를 만든 다음 SQL을 사용하여 다른 서버에 연결된 한 서버에서 쿼리를 실행할 수 있습니다.
  2. SQL 이외의 다른 것을 사용하여 클라이언트 측 조인을 수행 할 수 있습니다.

클라이언트 쪽 조인을 수행하려면 이러한 테이블이 큰 경우 클라이언트 쪽 메모리 요구를 최소화하기 위해 병합 조인을 사용하는 것이 좋습니다. 이 경우 두 SELECT 문에 모두 ORDER BY 절을 추가하여 기본 키로 두 항목을 정렬하거나 기본 키가없는 경우 일부 고유 키를 정렬합니다. 그런 다음 한 쪽을 반복하여 <, >== 비교를 사용하여 다른 레코드의 현재 레코드와 비교하여 레코드가 서로 일치하는지 확인하십시오. 그런 다음 레코드가 소스에 있고 목표에 있지 않은지, 목표에 레코드가 있고 소스에없는 경우 또는 레코드가 둘 다 존재했는지 여부를 판별 할 수 있습니다. 이 경우에 DataTable 대신 IDataReader을 사용하여 테이블이 실제로 큰 경우 메모리에 두 테이블을 모두로드하지 않아도됩니다.

또는 테이블이 크지 않고 RAM 클라이언트가 많으면 해시 조인을 사용할 수도 있습니다 (linq이 해결할 가능성이 높음). 한 쪽의 기본/고유 키를 Dictionary에로드 한 다음 다른 쪽의 모든 레코드를 테스트하여 Dictionary에 있는지 확인합니다. 코드 작성이 쉽고 빠를 수 있지만 더 많은 메모리가 필요합니다. 당신은 클라이언트 측 메모리를 절약하기 위해 IDataReader 대신 DataTable를 사용할 수 있지만 그것은 당신이 가입 완전히 메모리에 마지막으로

합니다 (Dictionary에서) 적어도 하나 개의 측면을해야합니다, 당신은 클라이언트 -을 수행하기 위해 LINQ 쿼리를 사용할 수 있습니다 SQL과 같은 방식으로 연결됩니다. 이것은 가장 적은 양의 코드 일 것입니다. DataTable에 두어야하며 Linq는 덮개 아래에 Dictionary 또는 Hashset을 사용하기 때문에이 작업을 수행하기 위해 메모리에 3 개의 복사본이 있습니다. 에서

관련 문제