0

これは最初は奇妙に思えるかもしれませんが、理にかなっていると思います! 私はlist<string>1 つずつ反復して実行する mysql 挿入ステートメントを持っています。これは問題なく動作しますが、私が達成しようとしているのはパフォーマンスの向上です。

代わりに、たとえば単一のクエリですべての値を渡したい

INSERT INTO tb1(field1,field2,field3) VALUES (1,2,3);
INSERT INTO tb1(field1,field2,field3) VALUES (4,5,6);
INSERT INTO tb1(field1,field2,field3) VALUES (7,8,9);

やりたい

INSERT INTO tb1(field1,field2,field3) VALUES (1,2,3), (4,5,6), (7,8,9);

基本的に、最初のクエリを開始点として保持し、リスト内のオブジェクトの数が何であれ、値から最後までブラケットセクションを追加する長いクエリ文字列を作成する必要があります-これは可能ですか?

4

2 に答える 2

2

これはうまくいくはずです。regex列と値string.Substringを見つけ、テーブル名を見つけるために使用しています。次に、単純な Linq クエリを使用しstring.Formatてすべてをまとめます。string.Join

IEnumerable<string> inserts = // add your insert-strings here;
string firstInsert = inserts.First();
int tableIndex = firstInsert.IndexOf("INSERT INTO ") + "INSERT INTO ".Length;
string table = firstInsert.Substring(
    tableIndex, firstInsert.IndexOf("(", tableIndex) - tableIndex);
var regex = new System.Text.RegularExpressions.Regex(@"\(([^)]+)\)",System.Text.RegularExpressions.RegexOptions.Compiled);
string columns = regex.Matches(firstInsert)[0].Value;

IEnumerable<string> values = inserts.Select(sql => regex.Matches(sql)[1].Value);

string insertAll = string.Format("INSERT INTO {0}{1} VALUES {2};"
    , table
    , columns
    , string.Join(",", values));

サンプル データを使用したデモ。

于 2013-01-24T10:25:02.577 に答える
1

別のテーブル (またはテーブル内の列のセット) に挿入する場合に備えて、

var perTableQueries = separateQueries
    .Select(s => s.Split(new[] {" VALUES "}, StringSplitOptions.None))
    .Where(a => a.Length == 2)
    .GroupBy(a => a[0], StringComparer.InvariantCultureIgnoreCase)
    .Select(g => String.Format("{0} VALUES {1};",
        g.Key,
        String.Join(",", g.Select(a => a[1].TrimEnd(';')).ToArray())));

テーブル/列セットごとに 1 つの挿入を行います (SQL が一貫している場合)。

とはいえ、各行のデータベースに個別のリクエストを行っている場合、最大のパフォーマンスの節約は

var singleRequest = String.Join("", perTableQueries.ToArray());
于 2013-01-24T10:43:06.247 に答える