0

T-SQL (Server 2008 R2) では、'Output' キーワードを使用して、挿入した行の ID を取得できることを知っています。たとえば、私はできる

insert into [Membership].[dbo].[User] (EmailAddress) 
output Inserted.UserId 
values('testUser1@test.com')

これを別のインサートに構成する方法はありますか? たとえば、新しいユーザーを追加し、すぐにそのユーザーを にUserRoleマップするテーブルに追加するとUserIdしますRoleId

基本的には、以下のようなことをしたいと思います。

insert into UserRole (RoleId, UserId) 
values 
(
    1, 
    insert into [Membership].[dbo].[User] (EmailAddress) 
    output Inserted.UserId values('testUser1@test.com')
)

しかし、私はこれを機能させることができないようです。内部挿入を角かっこ () で囲むか、select * from () などを使用してみました。

私は何が欠けていますか?この構成は可能ですか?

助けてくれてありがとう。

よろしく、

4

2 に答える 2

2

出力をテーブル変数にキャプチャする必要があります。

DECLARE @TempVar TABLE (UserID INT)

insert into [Membership].[dbo].[User] (EmailAddress) 
output Inserted.UserId INTO @TempVar(UserID)
values('testUser1@test.com')

次に、2 番目のステップで、その一時テーブルからターゲット テーブルに挿入します。

INSERT INTO dbo.UserRole (RoleId, UserId) 
   SELECT 
      (yourRoleId), tv.UserID
   FROM @TempVar tv

また、句をターゲット テーブルに直接指定することもできOUTPUTます。これは、たとえば に固定値を使用できる場合に機能しますRoleID

DECLARE @FixedRoleID INT = 42

INSERT INTO [Membership].[dbo].[User] (EmailAddress) 
OUTPUT @FixedRoleID, Inserted.UserId INTO dbo.UserRole(RoleId, UserId)
VALUES ('testUser1@test.com')
于 2012-08-24T05:31:54.930 に答える
0

別の解決策は、トリガーを使用することです。

http://msdn.microsoft.com/en-us/library/ms189799.aspx

「後」の挿入トリガーに注意してください。

のために | AFTER AFTER は、トリガー SQL ステートメントで指定されたすべての操作が正常に実行された場合にのみ、DML トリガーが起動されることを指定します。このトリガーが起動する前に、すべての参照カスケード アクションと制約チェックも成功する必要があります。

FOR が指定された唯一のキーワードである場合、AFTER がデフォルトです。

AFTER トリガーは、ビューでは定義できません。

于 2012-08-24T08:09:03.417 に答える