2010-03-20 48 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如何支持标识列而不是插入触发器。