3

挿入された行を選択する方法はありますか? 次のクエリを実行しようとしていますSqlCommand(データベースで特定の ID を予約するために使用されます):

INSERT INTO tbl (id)
SELECT COUNT(*) + 1 AS id from tbl

アプリで使用できるように、挿入された id 列を返す方法はありますか? または、これを達成できる簡単な方法はありますか?複数のユーザーが同時にアプリを使用する場合でも、無料の ID を確実に確保する必要があります。

また、ギャップを回避できるようにクエリを変更して最初の空き ID を選択する方法はありますか?

4

2 に答える 2

10

たとえば、新しく作成された ID を結果セットとして出力する句を簡単に使用できますOUTPUT。また、標準を使用して C# アプリからそれらを読み取ることができますSqlDataReader

INSERT INTO tbl (id)
OUTPUT Inserted.Id
   SELECT COUNT(*) + 1 AS id from tbl

更新:句によって返されるデータは、通常のステートメントOUTPUTのように C# 側からキャプチャできます。SELECT

string insertStmt = "INSERT INTO tbl (id) " + 
                    " OUTPUT Inserted.Id " + 
                    " SELECT COUNT(*) + 1 AS id from tbl";

using (SqlConnection conn = new SqlConnection(-your-connection-string-here-))
using (SqlCommand cmd = new SqlCommand(insertStmt, conn))
{
    conn.Open();

    // execute your INSERT statement into a SqlDataReader
    using(SqlDataReader reader = cmd.ExecuteReader())
    {
        // read the values returned from the OUTPUT clause
        while(reader.Read())
        {
            int insertedID = reader.GetInt32(0);
            // do something with those values....                
        }
    }

    conn.Close();
}
于 2013-05-19T20:00:44.610 に答える
0

idが ID 列の場合、SCOPE_IDENTITY()またはMAX(id)を使用して最新のレコード ID を取得できますが、これでは何も解決しません。そのレコードを取得している間に、別のレコードが挿入される場合があります。また、挿入された行を取得したい場合、それを行う 1 つの方法は、Triggersまたはinsertedキーワードを使用することです。ただし、ID 列は毎回一意の ID を返すため、ID を予約しようとしても無駄です。

于 2013-05-19T20:00:25.997 に答える