0

私は2つのテーブルを持っています:TableAそしてTableB

CREATE TABLE TableA (
[TableAId] [int] IDENTITY(1,1) NOT NULL...

CREATE TABLE TableB (
[TableBId] [int] IDENTITY(1,1) NOT NULL,
[TableAID] [int] NOT NULL... -- this is the FK

質問:(C#開発者として)

にINSERTする関数を書いていますTableA。新しく作成された主キーを取得して、他のデータと一緒TableAにのFKに挿入する必要があります。TableB

TableAこれは以前に行ったことがありますが、挿入直後にPK値をルックアップし、それを変数として格納してからに挿入するという方法が気に入らなかったTableB

誰かがこれを行うためのより効率的な方法を教えてもらえますか?ストアドプロシージャでscope_identity()を使用しているのでしょうか。に挿入する前にデータを追加できるように、C#に新しいPKを戻す必要があるため、トリガーは機能しませんTableB。さらに、これが実行されている間、両方のテーブルをロックしたいと思います。

ありがとう、ロバート

4

3 に答える 3

1
Declare @TableAId int

Insert TableA ( ... )
Values( ... )

Set @TableAId = Scope_Identity();

Insert TableB( TableAId, ... )
Values( @TableAId, ... )

これを 1 回のバッチで SQL Server に送信できることに注意してください。つまり、このコマンド テキスト全体を SQL Server に送信して、一度にすべて実行することができます。もちろん、テーブル Aテーブル B のすべての非 ID 列にパラメーターを使用する必要があります。次に例を示します。

const string sql = @"Declare @TableAId int

Insert TableA ( ... )
Values( ... )

Set @TableAId = Scope_Identity();

Insert TableB( TableAId, ... )
Values( @TableAId, ... )";

using ( var conn = new SqlConnection( ... ) )
{
    using ( var cmd = new SqlCommand( sql, conn ) )
    {
        cmd.Parameters.AddWithValue( @TableACol, ... );
        cmd.Parameters.AddWithValue( @TableACol2, ... );
        ...
        cmd.Parameters.AddWithValue( @TableBCol, ... );

        cmd.ExecuteNonQuery();
    }
}

SQL Server 2005 以降を使用している場合の別の選択肢は、OUTPUT 句を使用することです。

Insert TableA( ... )
    Output Inserted.TableAId, @TableBCol1, @TableBCol2, ...
    Into TableB
Values( ... )
于 2012-06-26T04:25:26.127 に答える
0

1 つのストアド プロシージャが両方のデータ セットを同時に挿入している場合は、このコードを使用します。

DECLARE @id INT

INSERT INTO [dbo].[TableA] VALUES (...)
SET @id = SCOPE_IDENTITY()

INSERT INTO [dbo].[TableB] VALUES (@id ...)

生の ADO を使用している場合は@id、OUTPUT パラメータとして設定し、2 番目の DB 呼び出しで戻り値を使用します。出力パラメーターの使用例については、こちらを参照してください。

両方のテーブルのロックに関しては、トランザクション (TSQL または ADO.NET) で呼び出しをラップするかSET TRANSACTION ISOLATION LEVEL SERIALIZABLE、ストアド プロシージャに を設定できます。

于 2012-06-26T04:24:29.420 に答える
0

これはうまくいきました...


USE [TestDB01] 

GO 

SET ANSI_NULLS ON 

GO 

SET QUOTED_IDENTIFIER ON 

GO

CREATE PROCEDURE [dbo].[sp_INSERT_INTO_Cars_And_Owners] 

-- ストアド プロシージャのパラメータをここに追加します。

         @PartnerId INT  
        , @Title NVARCHAR(100)  
        , @Description TEXT  
        , @IPAddress NVARCHAR(16)   
        , @IsCarOwner BIT
        , @OwnerTypeTypeID INT

AS 

BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON; 


DECLARE @CarId INT 


INSERT INTO [dbo].[Cars] ( 
    PartnerId 
    , Title 
    , Description 
    , IPAddress 
    , IsCarOwner 
    ) 
VALUES ( 
    @PartnerId 
    , @Title 
    , @Description 
    , @IPAddress 
    , @IsCarOwner 
    )  


SET @CarId = SCOPE_IDENTITY() 


INSERT INTO [dbo].[Owners] ( 
    OwnerTypeTypeID 
    , CarId 
    ) 

VALUES ( 
    @OwnerTypeTypeID 
    , @CarId 
    )  

END 
于 2012-06-26T14:43:16.967 に答える