【问题标题】:Catch Inserted ID from Trigger从触发器中捕获插入的 ID
【发布时间】:2016-01-07 12:39:54
【问题描述】:

我是 SQL 新手,所以不要大喊大叫。我的触发器有问题,该触发器旨在捕获最后插入的数据并对其进行更新。

create trigger ilgKodIsim on URTFIS instead of insert
as
SET NOCOUNT ON
SET IDENTITY_INSERT URTFIS ON

declare @id int;
insert into URTFIS ( [ID], [FISNO], [FISTAR], [URTTAR], [STATUS], [STOKID], [DEPOID], [BIRIMID], [MIKTAR],
[BIRIM1KATSAYI], [BIRIM2KATSAYI], [BIRIM3KATSAYI], [FIREORAN], [SIPARISID], [PROJEID], [KUR_RAPOR], 
[GENELTOPLAM], [GENELTOPLAM_RAPOR], [OZELGRUP1], [OZELGRUP2], [OZELALAN1], [OZELALAN2], [OZELALAN3], [OZELALAN4], [OZELALAN5], 
[OZELALAN6], [OZELALAN7], [OZELALAN8], [OZELALAN9], [OZELALAN10], [OZELALAN11], [OZELALAN12], [OZELALAN13],
[OZELALAN14], [OZELALAN15], [OZELALAN16], [OZELALAN17], [OZELALAN18], [OZELALAN19], [OZELALAN20], 
[ACIKLAMA], [BARKODID], [FATFISID], [MUHFISID], [SUBEID], [YETKIKODID], [OWN_URTFISID], [MASTER_URTFISID], 
[OTOMATIK_ALT_URUN], [GENELGRUP1], [GENELGRUP2], [GENELGRUP3], [GENELGRUP4], [GENELGRUP5], [ERP_LOTID], 
[ERP_LOT_CIKIS_GIRIS_HARID], [ERP_VARYANTID], [STKFISID], [STKFISHARID])

select

[ID], [FISNO], [FISTAR], [URTTAR], [STATUS], [STOKID], [DEPOID], [BIRIMID], [MIKTAR],
[BIRIM1KATSAYI], [BIRIM2KATSAYI], [BIRIM3KATSAYI], [FIREORAN], [SIPARISID], [PROJEID], [KUR_RAPOR], 
[GENELTOPLAM], [GENELTOPLAM_RAPOR], [OZELGRUP1], [OZELGRUP2],[OZELALAN1], [OZELALAN2], [OZELALAN3], [OZELALAN4], [OZELALAN5], 
[OZELALAN6], [OZELALAN7], [OZELALAN8], [OZELALAN9], [OZELALAN10], [OZELALAN11], [OZELALAN12], [OZELALAN13],
[OZELALAN14], [OZELALAN15], [OZELALAN16], [OZELALAN17], [OZELALAN18], [OZELALAN19], [OZELALAN20], 
[ACIKLAMA], [BARKODID], [FATFISID], [MUHFISID], [SUBEID], [YETKIKODID], [OWN_URTFISID], [MASTER_URTFISID], 
[OTOMATIK_ALT_URUN], [GENELGRUP1], [GENELGRUP2], [GENELGRUP3], [GENELGRUP4], [GENELGRUP5], [ERP_LOTID], 
[ERP_LOT_CIKIS_GIRIS_HARID], [ERP_VARYANTID], [STKFISID], [STKFISHARID]

from inserted

SET @id = Scope_Identity()

update URTFIS set OZELALAN2 = 'Deneme' where ID = @id

SET IDENTITY_INSERT URTFIS OFF

我检查后,值没有更新。我想不通。

【问题讨论】:

  • 标记使用的 dbms。 (根本不像 ANSI SQL。)
  • 你到底为什么要这样做 - 因为你已经接管了将数据插入基表的责任,所以不需要 INSERT 然后 UPDATE 新插入的行(s ) (请注意,rows,因此标量变量不适用于插入的多行),只需将 SELECT 子句中的 OZELALAN2 更改为 'Deneme'
  • 其实有一个软件在工作。当用户在表中添加一些数据时。我需要对这张表进行一些调整。

标签: c# sql sql-server triggers


【解决方案1】:

由于您使用的是IDENTITY_INSERT,因此您不会获得URTFIS.ID 的新标识值。

只需使用来自insertedID

update URTFIS set OZELALAN2 = 'Deneme' where ID = SELECT TOP 1 Id FROM Inserted

或者不要显式插入 ID:

create trigger ilgKodIsim on URTFIS instead of insert
as
SET NOCOUNT ON


declare @id int;
insert into URTFIS ([FISNO], [FISTAR], [URTTAR], [STATUS], [STOKID],    [DEPOID], [BIRIMID], [MIKTAR],
[BIRIM1KATSAYI], [BIRIM2KATSAYI], [BIRIM3KATSAYI], [FIREORAN], [SIPARISID], [PROJEID], [KUR_RAPOR], 
[GENELTOPLAM], [GENELTOPLAM_RAPOR], [OZELGRUP1], [OZELGRUP2], [OZELALAN1], [OZELALAN2], [OZELALAN3], [OZELALAN4], [OZELALAN5], 
[OZELALAN6], [OZELALAN7], [OZELALAN8], [OZELALAN9], [OZELALAN10],     [OZELALAN11], [OZELALAN12], [OZELALAN13],
[OZELALAN14], [OZELALAN15], [OZELALAN16], [OZELALAN17], [OZELALAN18],     [OZELALAN19], [OZELALAN20], 
[ACIKLAMA], [BARKODID], [FATFISID], [MUHFISID], [SUBEID], [YETKIKODID], [OWN_URTFISID], [MASTER_URTFISID], 
[OTOMATIK_ALT_URUN], [GENELGRUP1], [GENELGRUP2], [GENELGRUP3], [GENELGRUP4], [GENELGRUP5], [ERP_LOTID], 
[ERP_LOT_CIKIS_GIRIS_HARID], [ERP_VARYANTID], [STKFISID], [STKFISHARID])

select

[FISNO], [FISTAR], [URTTAR], [STATUS], [STOKID], [DEPOID], [BIRIMID], [MIKTAR],
[BIRIM1KATSAYI], [BIRIM2KATSAYI], [BIRIM3KATSAYI], [FIREORAN], [SIPARISID], [PROJEID], [KUR_RAPOR], 
[GENELTOPLAM], [GENELTOPLAM_RAPOR], [OZELGRUP1], [OZELGRUP2],[OZELALAN1], [OZELALAN2], [OZELALAN3], [OZELALAN4], [OZELALAN5], 
[OZELALAN6], [OZELALAN7], [OZELALAN8], [OZELALAN9], [OZELALAN10], [OZELALAN11], [OZELALAN12], [OZELALAN13],
[OZELALAN14], [OZELALAN15], [OZELALAN16], [OZELALAN17], [OZELALAN18], [OZELALAN19], [OZELALAN20], 
[ACIKLAMA], [BARKODID], [FATFISID], [MUHFISID], [SUBEID], [YETKIKODID], [OWN_URTFISID], [MASTER_URTFISID], 
[OTOMATIK_ALT_URUN], [GENELGRUP1], [GENELGRUP2], [GENELGRUP3], [GENELGRUP4],     [GENELGRUP5], [ERP_LOTID], 
[ERP_LOT_CIKIS_GIRIS_HARID], [ERP_VARYANTID], [STKFISID], [STKFISHARID]

from inserted

SET @id = Scope_Identity()

update URTFIS set OZELALAN2 = 'Deneme' where ID = @id

【讨论】:

  • 我试过了,但我得到了这个错误;类名:EDatabaseError 消息:更新失败。找到 0 条记录。我也无法理解这个错误。它应该有一些数据。不过还是谢谢。
  • 然后在我的回答中尝试其他解决方案。
  • 我试过了。我再次遇到同样的错误。我无法捕捉到最后插入的 ID。我尝试使用后触发器,但失败了。我搜索了很多条目,但我无法解决问题。我搜索了其他可能的错误,但现在我什么也没检测到。
  • @@IDENTITY 呢?
  • 为什么不在插入语句中使用 set OZELALAN2 to 'Deneme'?
【解决方案2】:

我会你需要的实际上更多的是:

create trigger ilgKodIsim on URTFIS
after insert --not instead of
as
SET NOCOUNT ON

update URTFIS set OZELALAN2 = 'Deneme' where ID IN (select ID from inserted)

我认为没有理由编写 instead of 触发器,其中第一个操作是执行与没有触发器时完全相同的插入操作。

尝试将插入的标识列的“the”值放入标量变量注定会失败,因为可以编写多行 INSERT 语句(实际上,在您的原始触发器中有一个示例)。触发器仅触发一次,inserted 中有 多个 行,因此刚刚分配了 多个 个标识值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多