1

私は通常、正しい scope_identity() 値を取得するために、レコードを挿入するときにストアド プロシージャを使用します。現在 SqlClient を使用している場合、挿入されたレコードの id フィールドを取得する必要があります。

私の理解では、scope_identity() コマンドを挿入でバッチ処理すると、挿入コマンドと同じスコープに残りますか? 以下のようなもの。確認するのは難しいですが...これで100%正しいID値を取得できますか..?

(id フィールドは自動インクリメント bigint - Sql Server)

long newid = 0;

using (SqlConnection conn = new SqlConnection(....))
{
    conn.Open();
    using (SqlCommand comm = new SqlCommand ("insert into .... ; select SCOPE_IDENTITY();", conn))
    {
        SqlDataReader reader = comm.ExecuteReader();
        if (reader.HasRows)
        {
            reader.Read();
            newid = Convert.ToInt64(reader[0]);
        }
    }
}
4

1 に答える 1

3

SCOPE_IDENTITY(強調鉱山)のドキュメントから:

同じスコープ内の ID 列に最後に挿入された ID 値を返します。スコープは、ストアド プロシージャ、トリガー、関数、またはバッチなどのモジュールです。したがって、2 つのステートメントが同じストアド プロシージャ、関数、またはバッチ内にある場合、これらのステートメントは同じスコープ内にあります。

この場合、コマンドは次のとおりです。

"insert into .... ; select SCOPE_IDENTITY();"

はバッチであるため、そのバッチで最後に挿入された ID 値を取得します。この場合は、バッチ内の唯一の他のステートメントであるため、挿入の ID 値です。

于 2012-03-12T21:58:33.837 に答える