0

こんにちは私はから大量のデータを入力しようとしてJSON to SQL Serverいるので、私が調査したことによると、JSON to DataTable and then use SQLBulkWriteToSever(dataTable)を使用してサーバーにデータを書き込むように変換できます。それが最善の方法ですか?

Scope_identity()そして、この方法で各行の挿入を抽出するにはどうすればよいですか?

4

1 に答える 1

1

一括挿入コマンドからスコープIDを抽出することは実際には不可能です。挿入ステートメントですべてのscope_identity()値を正確に取得する場合は、実際には各レコードを個別に挿入する必要があります。

ただし、テーブルパラメータの挿入の使用を検討することもできます(ここに記事を書きました:http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/)。

まず、テーブル挿入タイプを作成します。

CREATE TYPE item_drop_bulk_table_rev4 AS TABLE (
    item_id BIGINT,
    monster_class_id INT,
    zone_id INT,
    xpos REAL,
    ypos REAL,
    kill_time datetime
)

次に、データを挿入するプロシージャを作成します。

CREATE PROCEDURE insert_item_drops_rev4
    @mytable item_drop_bulk_table_rev4 READONLY
AS

BEGIN TRANSACTION

-- Lookup the current ID
DECLARE @id_marker bigint
SELECT @id_marker = MAX(primary_key_column) FROM item_drops_rev4 

-- Insert all the data
INSERT INTO item_drops_rev4 
    (item_id, monster_class_id, zone_id, xpos, ypos, kill_time)
SELECT 
    item_id, monster_class_id, zone_id, xpos, ypos, kill_time 
FROM 
    @mytable

-- Return back the identity values
SELECT * FROM item_drops_rev4 WHERE primary_key_column > @id_marker

COMMIT TRANSACTION

3番目に、このデータを挿入するC#コードを記述します。

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("item_id", typeof(Int64)));
dt.Columns.Add(new DataColumn("monster_class_id", typeof(int)));
dt.Columns.Add(new DataColumn("zone_id", typeof(int)));
dt.Columns.Add(new DataColumn("xpos", typeof(float)));
dt.Columns.Add(new DataColumn("ypos", typeof(float)));
dt.Columns.Add(new DataColumn("timestamp", typeof(DateTime)));

for (int i = 0; i < MY_INSERT_SIZE; i++) {
    dt.Rows.Add(new object[] { item_id, monster_class_id, zone_id, xpos, ypos, DateTime.Now });
}

// Now we&#039;re going to do all the work with one connection!
using (SqlConnection conn = new SqlConnection(my_connection_string)) {
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("insert_item_drops_rev4", conn)) {
        cmd.CommandType = CommandType.StoredProcedure;

        // Adding a "structured" parameter allows you to insert tons of data with low overhead
        SqlParameter param = new SqlParameter("@mytable", SqlDbType.Structured);
        param.Value = dt;
        cmd.Parameters.Add(param);
        SqlDataReader dr = cmd.ExecuteReader()
        // TODO: Read back in the objects, now attached to their primary keys
    }
}

現在、理論的には、単一の「idマーカー」のみを取得できます。ただし、SQL Serverのすべてのバージョンが常にデータテーブルの挿入から線形の順序でレコードを挿入することを確信しているわけではないので、データバッチ全体を取得する方が安全だと思います。

于 2012-07-18T17:23:37.160 に答える