gpt4 book ai didi

sql - 在内部使用 OUTPUT/INTO 而不是插入触发器会使 'inserted' 表无效

转载 作者:行者123 更新时间:2023-12-04 15:49:04 25 4
gpt4 key购买 nike

我在使用带有而不是插入触发器的表时遇到问题。

我创建的表包含一个标识列。我需要在这个表上使用而不是插入触发器。我还需要从触发器中查看新插入的标识的值,这需要在触发器中使用 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,这个问题就会消失。

关于我做错了什么的任何想法?还是我想做的事情不可行?

谢谢。

最佳答案

您还没有指定您的“客户”是什么,但如果它们是 .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;

就客户端而言,这会导致插入行为类似于选择查询 - 您可以遍历结果以获取标识值(或其他特殊值,如时间戳)。

这就是 LinqToSql 支持标识列而不是插入触发器的方式。

关于sql - 在内部使用 OUTPUT/INTO 而不是插入触发器会使 'inserted' 表无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com