2010-12-17 19 views
0

OracleとSQL Serverテーブル間のデータを効率的に比較する方法を探しています。私は、Oracleのテーブルを制御することはなく、選択クエリだけを実行することができます。この表には30,000以上の行が含まれています。現在、私はOracleテーブルからデータセットを作成し、それを維持しているSQL Serverテーブルと比較します。このケースでは、SQL Serverテーブルの学生番号の有無を確認しています。番号が存在しない場合は、SQL Serverテーブルに挿入します。これはあなたが想像することができるように、ひどく非効率的です。あなたの提案や例は非常に高く評価されます。OracleテーブルとSQL Serverテーブルの比較

+1

1. SQLはクエリ言語です。 SQL Serverを意味しますか? 2. *あなたは何をしようとしていますか?あなたは*あなたがそれをやる方法を説明しました。 – Ronnis

+0

SQL Server。最終目標は、午前のレポートを実行し、新しく生徒のみをOracleテーブルでキャプチャし、SQL Serverテーブルにコピーすることです。 – gnome

答えて

2

Oracleインスタンスにアクセスできるアカウントを使用して、SQL ServerにLinked Server instanceを作成します。

次に、あなたが使用して、不足している内容でSQL Serverテーブルを更新することができます。

INSERT INTO [SQLServer].[dbo].[table] 
SELECT columns 
    FROM [Oracle].[database].[schema].[table] x 
WHERE NOT EXISTS(SELECT NULL 
        FROM [SQLServer].[dbo].[table] y 
        WHERE y.student_number = x.student_number) 

がありNOT INとLEFT JOINをしている/ NULL代替IS - NOT IN and NOT EXISTS perform better than LEFT JOIN/IS NULL when the columns compared (in this case, student_number) is not nullable (the value can never be NULL)

script this as a SQL Server Agent Job if you need it to run periodicallyに簡単です。

+0

+1。私はそのような承認を試みましたが、CLOB列が関与している場合は機能しませんでした。私はそれがいくつかのコードページの非互換性によって引き起こされたのか、OLEDBの一般的な制限であるのか分かりません(リンクされたサーバーはOLEDBを使用するようです)。問題のある列がなければ、それは本当にうまく動作します。 –

+0

これはうまくいくようですが、サーバー上で追加の設定や構成が必要です。私はこれらを支配していない。 – gnome

0

これは良い答えであるかどうかはわかりませんが、あなたが求めているものを見るのは難しいですが、私は個人的にRDBMSに処理負荷を軽減します。その代わりに、関連する値だけを返す単一のselect文をアルゴリズムで作成します。

これは、NOT INのSQL演算子を使用して実行できます。

ですから、通常どおりしかし、あなたの文字列を始める...

String statement = "SELECT * FROM OracleDB where StudentID NOT IN ("; 
foreach (val in StudentIDValuesFromYourDB) 
{ 
    statement = statement.concat(val + ", "); 
} 
statement = statement.substring(0,statement.length()-2);//remove the extra comma 
statement = statement.concat(")"); 

確かにそれは巨大なの文であり、私はそれをしても私は確かに大きな(もだということが許可されるかどうかわからないですオラクルの構文のうち、私はOracleクライアントのために私の仕事に順応するのが嫌いですが)、私はRDBMSがあなたのためにこのすべての仕分け作業を行うためによりよく最適化されるだろうと考えています。この文を実行できる場合は、OracleDBにある値のみを取得し、自分のDBには格納しません。

このリストを使用して、関連する挿入文だけを生成できるようになりました。

+0

Nope too文も大きすぎます。しかし、あなたの提案を感謝します。 – gnome

+0

笑、私はそれを恐れていた。 – gnomed

1

単純なSSISパッケージで十分です。 OracleとSQLServerからデータを取得するデータフロータスクを作成します。これらのタスクは、それらを比較し、失敗時に更新し、成功時に挿入するルックアップコントロールです。 SSISは非常に高速かつ効率的に設計されています。

+0

ちょうど私が入力していたものですが、あなたは私をEnterキーに倒しました。また、パッケージを使用すると、レポートを実行する直前に毎日実行するようにスケジュールできます。 – HLGEM

+0

@HLGEM幸運次回:-)。いい点がありました。 –

0

ありがとうございます。 OMG Poniesは、私が必要とするものに対して適切なソリューションであるため、小切手を手に入れます。ただし、サーバーはリンクされていません。だから私はlinqを使用して回避策を書く必要がありました。

まず私がオブジェクトに設定されたOracleデータを変換:

List<Student> studentList = new List<Student>(); 
studentList = (from d in dataSet 
    select new Student 
    { 
     StudentNumber = d.STUDENTNUMBER, 
     .... other properties 
    }).ToList(); 

私はその後、comparer classを書いて、その差を返しました:

public IEnumerable<Student> ListNewStudents(IEnumerable<Student> studentList) 
{ 

    List<Student> otherStudentList = (from s in _dataContext.Students 
     select new Student 
     { 
      StudentNumber = s.StudentNumber 
     }).ToList(); 

    return studentList.Except(otherStudentList, new StudentComparer()).ToList(); 
} 

は完全に働いたと私は再び幸せな男です。

関連する問題