Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取未标识的最后一个主键-使用触发器插入_Sql Server_Sql Server 2008_Primary Key - Fatal编程技术网

Sql server 获取未标识的最后一个主键-使用触发器插入

Sql server 获取未标识的最后一个主键-使用触发器插入,sql-server,sql-server-2008,primary-key,Sql Server,Sql Server 2008,Primary Key,我有一个insert触发器来插入表的主键VARCHAR。我想获取最后插入的主键值。 这是我的插入触发器 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 fr

我有一个insert触发器来插入表的主键VARCHAR。我想获取最后插入的主键值。 这是我的插入触发器

   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 CategoryID=@cat;
    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
我试图编写一个函数来获取最后插入的主键值,但它似乎不起作用..因为在触发器之外没有插入的作用域。请帮助我。。 我在触发器中使用output子句尝试了这段代码,到目前为止没有结果

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;

有什么帮助吗?

好的。几周前我遇到了完全相同的问题

我试过很多不同的方法,但都没有用。长话短说-我最后添加了一个类型为UNIQUEIDENTIFIER guid的新列

以您的示例为例,假设dbo.Equipment中有一个名为guid的列

大致来说,您可以这样做:

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
从插入

然后,您可以使用@Temp\u Tbl.guid查询dbo.device以获取插入的id。 例如:


从dbo.Equipment e(如果存在)中选择EquipmentID从@Temp_Tbl tt(如果tt.guid=e.guid)中选择*。旁白:触发器对一组行进行操作。您的触发代码假定插入了一行。您的PK是默认为NEWID的唯一标识符吗?如果是这样,为什么不首先生成NEWID,将其存储在触发器中的变量中,然后手动插入该值呢?我在这里发现了一个问题:选择@cat=CategoryID from INSERTED;。我认为,如果有人使用相同的语句插入两行具有不同CategoryID值的数据,那么这段代码将无法正常工作:insert INTO dbo.device…,CategoryID。。。值…,1,…,2@user92546是否有办法插入多行..触发器是否能正常工作?@shanirafi-通常,您会在触发器中写入insert,以根据INSERTED和任何其他需要的表进行所有计算,而不是从INSERTED中获取单个CategoryID。这样插入的行数就不重要了。如果需要,可以在中间处理中使用表变量,而不是标量。