8

SQL Server 2008 を使用して ASP.NET プロジェクト (C#) に取り組んでいます。

データベースのテーブルに行を挿入するときに、テーブルのIDENTITY (自動インクリメント)である、最後に挿入された ID を取得したいと考えています。

別のクエリを使用したくないので、次のようなことをします...

SELECT MAX(ID) FROM USERS;

なぜなら - クエリは 1 つだけなのに - つまらないと感じるからです...

何かを挿入するときは、通常、影響を受けた行の数を返すExecuteNonQuery()を使用します。

int y = Command.ExecuteNonQuery();

別のクエリを使用せずに最後に挿入された IDを返す方法はありませんか?

4

4 に答える 4

18

ほとんどの人は、次の方法でこれを行います。

INSERT dbo.Users(Username)
VALUES('my new name');

SELECT NewID = SCOPE_IDENTITY();

(または、クエリの代わりに、それを変数に割り当てます。)

したがって、実際にはテーブルに対する2つのクエリではありません...

ただし、次の方法もあります。

INSERT dbo.Users(Username)
OUTPUT inserted.ID
VALUES('my new name');

ただし、これを実際に取得することはできませんExecuteNonQuery

于 2013-01-12T23:39:33.757 に答える
5

ストアド プロシージャからの出力パラメータとして id を返すことができます。@userId int output

そして挿入後、SET @userId = scope_identity()

于 2013-01-12T23:39:09.140 に答える
3
  • クエリは1つだけですが、不自由な感じがします...

複数の重複する isert を持つことができるため、実際には間違っています。

これは、私がいつもおかしいと思っていることの 1 つです。ドキュメントを読んでいない人々です。

SELECT SCOPE_IDENTITY()

特定のスコープで生成された最後の ID 値を返し、構文的に正しいです。また、適切に文書化されています。

別のクエリを使用せずに最後に挿入された ID を返す方法はありませんか?

はい。saame SQL バッチで番号を尋ねます。

INSERT (blablab9a); SELECT SCOPE_IDENTITY ();

1 つの文字列として。実行スカラー。

1 つのバッチに複数の SQL ステートメントを含めることができます。

于 2013-01-12T23:40:03.193 に答える
2

C# コードからクエリを実行し、最後に挿入された ID を取得する場合は、次のコードを見つける必要があります。

SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        connection.Open();
        string sql = "Insert into [Order] (customer_id) values (" + Session["Customer_id"] + "); SELECT SCOPE_IDENTITY()";
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = connection;
        cmd.CommandText = sql;
        cmd.CommandType = CommandType.Text;
        var order_id =  cmd.ExecuteScalar();

        connection.Close();
        Console.Write(order_id);
于 2016-01-11T01:10:58.053 に答える