2012-04-18 47 views
0

我有一个插入触发器来插入表的主键(varchar)。我想要获取最后插入的主键值。 这些是我的INSERT触发器获取最后一个主键 - 非身份 - 使用触发器插入

ALTER TRIGGER dbo.equipment_insert_pk 
    ON dbo.Equipment 
    INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    declare @id int; 
    declare @cat varchar(2); 
    select @cat=CategoryID from INSERTED; 
    select @id=cast(max(right(EquipmentID,4)) as int) from Equipment where [email protected]; 
    set @id=isnull(@id,0)+1; 
    -- Insert statements for trigger here 
    insert into Equipment 
    select CategoryID+right('0000'+cast(@id as varchar(4)),4) 
    ,CategoryID 
    ,Location 
    ,Detail 
    ,'../BarcodeImage/'+CategoryID+right('0000'+cast(@id as varchar(4)),4)+'.jpeg' from INSERTED; 

END 

我试着写一个函数来获取最后插入的主键值,但它似乎没有work..because没有“插入”外trigger.Help我余地。 。 我试图触发在此代码输出条款没有结果至今..

insert into Equipment 
    output INSERTED.EquipmentID into @Temp_Tbl 
    select CategoryID+right('0000'+cast(@id as varchar(4)),4) 
    ,CategoryID 
    ,Location 
    ,Detail 
    ,'../BarcodeImage/'+CategoryID+right('0000'+cast(@id as varchar(4)),4)+'.jpeg' from INSERTED; 

任何帮助?

+2

可以使用一个'OUTPUT'子句外部的触发的捕获插入的值(一个或多个)。旁白:触发器在一组行上操作。你的触发器代码假设插入了一行。 – HABO 2012-04-18 14:25:53

+1

你的PK是一个UNIQUEIDENTIFIER,默认为NEWID()?如果是这样,为什么不先生成NEWID(),将它存储在INSTEAD OF触发器中的变量中,然后手动插入该值? – 2012-04-18 14:46:21

+1

我在这里发现了一个问题:'select @ cat = INSERTED中的CategoryID;'。我认为如果有人使用相同的语句插入两行不同的'CategoryID'值,那么这段代码将无法正常工作:'INSERT INTO dbo.Equipment(...,CategoryID,...)VALUES(..., 1,...),(...,2,...);' – 2012-04-18 15:23:53

回答

1

好的。几周前我遇到了同样的问题。

我试过很多不同的方法 - 无济于事。长话短说 - 我结束了同类型的UNIQUEIDENTIFIER(GUID)添加新列

所以用你的例子 - 假设有一个在dbo.Equipment

粗略地称为​​栏,这里是你如何做到这一点:

insert into Equipment 
    output INSERTED.EquipmentID, INSERTED.guid into @Temp_Tbl 
    select CategoryID+right('0000'+cast(@id as varchar(4)),4) 
    ,CategoryID 
    ,Location 
    ,Detail 
    ,'../BarcodeImage/'+CategoryID+right('0000'+cast(@id as varchar(4)),4)+'.jpeg' 
    ,NEWID() -- new column 

from INSERTED;

然后,您可以使用@Temp_Tbl.guid查询dbo.Equipment以获取插入的ID。 例如:

SELECT EquipmentID FROM dbo.Equipment e WHERE EXISTS (SELECT * FROM @Temp_Tbl tt WHERE tt.guid = e.guid)

+0

它帮助了很多...但我在触发器之外创建了一个单独的表格(Temp_Tbl).. – smrpm 2012-04-19 09:38:20