web-dev-qa-db-ja.com

c#を使用したSQL Server Insertコマンドからの戻り値

Visual StudioでC#を使用して、次のようにテーブルに行を挿入しています。

INSERT INTO foo (column_name)
VALUES ('bar')

このようなことをしたいのですが、正しい構文がわかりません。

INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id

これは、新しく挿入された行からfoo_id列を返します。

さらに、このための正しい構文を見つけたとしても、別の問題があります。SqlDataReaderSqlDataAdapterを自由に使用できます。私の知る限り、前者はデータの読み取り用で、2番目はデータの操作用です。 returnステートメントで行を挿入するとき、私はデータの操作と読み取りの両方を行っているため、何を使用すべきかわかりません。たぶん私はこれに使用する必要がある完全に異なるものがありますか?

23
Neko

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

SqlCommand.ExecuteScalar を使用して、挿入コマンドを実行し、1つのクエリで新しいIDを取得できます。

using (var con = new SqlConnection(ConnectionString)) {
    int newID;
    var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newID = (int)insertCommand.ExecuteScalar();
    }
}
63
Tim Schmelter

これを試して:

INSERT INTO foo (column_name)
OUTPUT INSERTED.column_name,column_name,...
VALUES ('bar')

[〜#〜] output [〜#〜]は、(特に)結果セットを返すことができます。参照: OUTPUT Clause(Transact -SQL) 。また、複数の値を挿入する場合(INSERT SELECT)、このメソッドは挿入された行ごとに1行を返します。他のメソッドは最後の行の情報のみを返します。

作業例:

declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5))

INSERT INTO @YourTable (YourCol1)
OUTPUT INSERTED.YourID
VALUES ('Bar')

出力:

YourID
-----------
1

(1 row(s) affected)
13
KM.