sql >> データベース >  >> RDS >> Sqlserver

SQL - Scope_Identity() を使用した INSERT - レコード ID の取得

    そもそもなぜ複数のステートメントでこれを行うのですか?理由:

    INSERT dbo.Items (item_name,  item_cost, item_code) 
      OUTPUT inserted.ItemID, @ProjectID, @ItemQuantity 
      INTO dbo.project_items(item_id, project_id, item_quantity)
    VALUES (@ItemName, @ItemCost, @ItemCode);
    

    ExecuteNonQuery() を 1 つ呼び出すだけで済みます。 アプリは実際の SCOPE_IDENTITY() を気にする必要はありません 生成される値。 (まだ SCOPE_IDENTITY() を取得できます もちろん、必要に応じて ExecuteScalar を使用します - しかし、Nenad が正しく指摘しているように、両方を呼び出すのではなく、どちらかを選択してください。)

    ここに明示的な外部キーがあることがわかったので、OUTPUT を使用できなくても、C# コードを 1 回の呼び出しに減らすことができます。

    DECLARE @i INT;
    
    INSERT dbo.Items (item_name,  item_cost, item_code) 
      SELECT @ItemName, @ItemCost, @ItemCode;
    
    SELECT @i = SCOPE_IDENTITY();
    
    INSERT dbo.project_items(item_id, project_id, item_quantity)
      SELECT @i, @ProjectID, @ItemQuantity 
    
    SELECT @i; -- if necessary
    

    これをストアド プロシージャに入れるとさらにきれいになります。



    1. PostgreSQL:VACCUMFULLとpg_dumpおよびrestore

    2. mysqlエラー:サブクエリが複数の行を返す

    3. ORACLEから読み取られた最速のOLEDB

    4. 修正方法 プロバイダは Oracle クライアントのバージョンと互換性がありませんか?