2009-04-24 24 views
0

これは狂った質問かもしれないと思うし、もし誰かがそれを行う方法の良いアイデアを持っているなら、是非教えてください。DB2テーブルから選択してSQLテーブルに挿入

私は、従業員が従わなければならない会社の基準に照らして、特定のテーブルを検証する仕事中の.Net C#プロジェクトを持っています。テーブルは、SQL ServerまたはDB2上に置くことができます。最初にテーブルがプログラムに追加されると、select文を使用して(SQLの場合)またはsyscat.columns(db2の場合)を使用してテーブルに関するメタデータ/情報を収集します。そのデータを取得したら、プログラムで検証されたすべてのテーブルについて同じ情報を格納しているSQL Server上にテーブルに格納します(all_table_informationとします)。

テーブルがSQLテーブルであれば、私は(もちろん私が欲しいのテーブルから列だけにそれを制限する)このクエリを実行することができます

insert into [all_table_information] 
    (table_id, column_name, data_type, max_char_length) 
select table_id, column_name, data_type, character_maximum_length 
    from information_schema.columns 
    where ...restrict to needed table... 

そして、SqlCommandオブジェクトのそれを実行します。しかし、それはDB2テーブルであれば、私は(私は必要な列に再び制限)このクエリを実行する必要があります。

select tabschema, tabname, colname, typename, length 
from syscat.columns 
where ...restrict to needed table... 

そして、それは使用してそれぞれの行を挿入してその結果、ループでDataReaderを取得:

while (dr.Read()) 
{ 
    insert into [all_table_information] 
    (table_id, column_name, data_type, max_char_length) values 
    (..."'" + dr["whatever"] + "', '" + ....) 

    ...execute sql here... 

} 
dr.Close(); 

このようにすると動作は遅くなりますが、1つのステートメントでこれを行うにはどうしたらいいのでしょうか?私はあなたもデータテーブルには、db2テーブルの情報を保存することができます知っているが、直接データテーブルに対してクエリを実行することはできますか?

おかげで、 ライアン

答えて

1

はおそらく、SqlBulkCopyを使用したい:それは行ごとに個別の挿入を行うよりもはるかに高速です MSDN

+0

このクラスは他のDBには制限があります。 SqlBulkCopyクラスを使用してSQL Serverテーブルにのみデータを書き込むことができます。 – lsalamon

+0

はい、私の理解では、RyanはSqlBulkCopyを使用するためにSQL Serverのデータベーステーブルにすべてを格納したいと考えています。 – Steven

+0

スティーブンが正しいです。これは私が必要とするもののように見えます。ありがとう。 – ryanulit

1

は、あなたがそれを行うにはアプリをSSISを使用するのではなく、書き込みと考えたことがありますか?

+0

.NET内からSSISを呼び出すことはできますか?列情報が得られるテーブルは、プログラム内の一連のコンボボックス選択から決定されます。 – ryanulit

+0

DTSパッケージを使用していると確信できます –

1

SqlCommanddr.Read()の外側に作成し、パラメータを使用する方がよいでしょう。これにより、パフォーマンスとセキュリティが向上し、構文を動的に正しく構成することを心配する必要がなくなります。このように...

SqlCommand insertCommand = new SqlCommand(connection); 

insertCommand.CommandText = @" 
insert into [all_table_information] 
(table_id, column_name, data_type, max_char_length) 
values 
(@table_id, @column_name, @data_type, @max_char_length)"; 

...create your parameters and add them here 

insertCommand.Prepare(); //precompiles the query 
while (dr.Read()) 
{ 
    ...set parameter values 

    insertCommand.ExecuteNonQuery(); 
} 
dr.Close();