2011-12-15 17 views
1

私は今使ったINSERT文からfirstnameとlastnameをどのように取得するかを考えています。それは行を作成し、次の挿入ステートメントで使用する名と姓を使用したいと思います。最後に挿入された行からデータを取得

SCOPE_IDENTITY()によって捕捉されたIDを使用して
Declare @idnt int 

INSERT INTO dbo.Contacts (ContactFirstName,ContactLastName,ContactCompany) VALUES ('Richard','Burns',NULL); 

SELECT @idnt = SCOPE_IDENTITY() 

INSERT INTO dbo.Activity (ContactID, ActivityDate, ActivityName, ActivityNote, ActivityOwner) 
VALUES (@idnt, '12/13/2011 10:55AM', 'Contact ' + @fname + " " + @lname + ", was automatically added by the system', 'Contact was automatically added by this system', 'System') 

答えて

4

outputを使用してください! outputsee hereある魔法の詳細について

INSERT INTO dbo.Activity (
    ContactID, 
    ActivityDate, 
    ActivityName, 
    ActivityNote, 
    ActivityOwner 
) 
SELECT 
    ContactID, 
    GETDATE(), 
    'Contact ' + ContactFirstName + ' ' + ContactLastName, 
    'Contact was added by the system.', 
    'System' 
FROM (
    INSERT INTO dbo.Contacts (ContactFirstName,ContactLastName,ContactCompany) 
    OUTPUT inserted.ContactID, inserted.ContactFirstName, inserted.ContactLastName 
    VALUES ('Richard','Burns',NULL) 
) x 

テーブルのトリガを使用して、毎回手動で手動で挿入するのではなく自動化することもできます。また、inserted/deletedテーブルも使用します。

あなたはこれをすることを行うだろう:任意の行をコンタクトに挿入しますたび

CREATE TRIGGER Contact_LogActivity ON dbo.Contacts FOR INSERT AS 
INSERT INTO dbo.Activity (
    ContactID, 
    ActivityDate, 
    ActivityName, 
    ActivityNote, 
    ActivityOwner 
) 
SELECT 
    ContactID, 
    GETDATE(), 
    'Contact ' + ContactFirstName + ' ' + ContactLastName, 
    'Contact was added by the system.', 
    'System' 
FROM 
    Inserted 

さて、それは活動にそれをログに記録します。トリガーの詳細については、hereを参照してください。

+0

+1私はOUTPUTについて言及するつもりでした...私は10分遅れました! – SQLMason

0

、テーブルをバック照会して、宣言した変数にContactFirstNameContactLastNameつかむ:それぞれ@fname@lnameを:

... 
SELECT @idnt = SCOPE_IDENTITY() 

SELECT 
    @fname = ContactFirstName 
    , @lname = ContactLastName 
FROM dbo.Contacts 
WHERE YOUR_IDENTITY_COLUMN_HERE = @idnt 

INSERT INTO dbo.Activity ... 

ID列の名前でYOUR_IDENTITY_COLUMN_HEREを置き換えそこからあなたはSCOPE_IDENTITY()をつかんでテストすると仮定しました。

+0

「SCOPE_IDENTITY」が嫌いな唯一の理由は、正確でないかもしれないということです。あなたがレコードを挿入する競合状態の影響を受けやすく、別のユーザーがあなたの 'SCOPE_IDENTITY'が動く前にレコードを挿入し、その結果として間違ったIDを取得する。これは、バグとして認識するのは非常に難しいかもしれません。 – Eric

+1

@エリック:私はこれが当てはまるとは思わない - 結局のところ、それは**スコープ**のアイデンティティと呼ばれています....あなたのスコープに**最後に挿入されたアイデンティティ**を与えるでしょう - 別の接続の新しい行が挿入されます**返される** IDには影響しません... [MSDN docs on SCOPE_IDENTITY](http://msdn.microsoft.com/en-us/library/ms190315)を参照してください。 .aspx)。 'IDENT_CURRENT(tablename)'はスコープによって制限されませんが、常にそのテーブルに最後に挿入されたIDを返します。 –

+0

@marc_s:コメントが編集されました!私はまだ可読性上の理由で 'output'がより好きですが、' scope_identity'の振る舞いと '@@IDENTITY'の振る舞いを混同していた点で正しいです。 – Eric

0

私はあなたが見ていると思いますselect文を使用して挿入するために使用します。試してみてください:

INSERT INTO dbo.Activity (ContactID, ActivityDate, ActivityName, ActivityNote, ActivityOwner) 
    SELECT @idnt, '12/13/2011 10:55AM', 'Contact ' + ContactFirstName + ' ' + ContactLastName + ', was automatically added by the system', 'Contact was automatically added by this system', 'System' 
    FROM Contacts 
    WHERE ContactId = @idnt 
関連する問題