2010-03-20 58 views
4

我有一個問題,而不是插入觸發器使用表。使用OUTPUT/INTO而不是插入觸發器無效'插入'表

我創建的表包含標識列。我需要在此表上使用插入觸發器。我還需要從我的觸發器中看到新插入的身份的值,這需要在觸發器中使用OUTPUT/INTO。問題是執行INSERT的客戶端無法看到插入的值。

例如,創建一個簡單的表:

CREATE TABLE [MyTable](
[MyID] [int] IDENTITY(1,1) NOT NULL, 
[MyBit] [bit] NOT NULL, 
CONSTRAINT [PK_MyTable_MyID] PRIMARY KEY NONCLUSTERED 
(
[MyID] ASC 
)) 

接着我創建一個簡單的,而不是觸發的:

create trigger [trMyTableInsert] on [MyTable] instead of insert 
as 
BEGIN 
DECLARE @InsertedRows table(MyID int, 
           MyBit bit); 

INSERT INTO [MyTable] 
     ([MyBit]) 
    OUTPUT inserted.MyID, 
      inserted.MyBit 
    INTO @InsertedRows 
    SELECT inserted.MyBit 
    FROM inserted; 

-- LOGIC NOT SHOWN HERE THAT USES @InsertedRows 
END; 

最後,我試圖執行插入和檢索插入的值:

DECLARE @tbl TABLE (myID INT) 

insert into MyTable 
(MyBit) 
OUTPUT inserted.MyID 
    INTO @tbl 
VALUES (1) 

SELECT * from @tbl 

這個問題是我得到的所有回報爲零。我可以看到該行已正確插入表中。我也知道,如果我從觸發器中刪除OUTPUT/INTO,這個問題就會消失。

有什麼想法,我做錯了什麼?或者我是如何做事情不可行的?

謝謝。

回答

2

您尚未指定您的'客戶',但如果它們是.Net或類似的應用程序,則只需放棄輸出的INTO部分。您的客戶無法看到結果,因爲它們沒有被返回到結果集中。

,您的觸發則應該是這樣的:

create trigger [trMyTableInsert] on [MyTable] instead of insert 
as 
BEGIN 

INSERT INTO [MyTable] 
     ([MyBit]) 
    OUTPUT inserted.MyID, 
      inserted.MyBit 
    SELECT inserted.MyBit 
    FROM inserted; 

-- LOGIC NOT SHOWN HERE THAT USES @InsertedRows 
END; 

這將導致插入到只要客戶端而言表現得像一個選擇查詢 - 你可以對結果進行迭代,以獲得標識值(或其他特殊值,如Timestamp)。

這就是LinqToSql如何支持標識列而不是插入觸發器。