SQL Server:获取行标识

SQL Server:获取行标识,sql,sql-server,Sql,Sql Server,我将此作为存储过程的第一部分: DECLARE @_id as int if exists(select 1 from JTrack_Visitors WHERE cookie = @cookie) begin UPDATE JTrack_Visitors SET LastSeen = @_now WHERE cookie = @cookie end else begin INSERT INTO JTrack_Visitors(Cookie, Created

我将此作为存储过程的第一部分:

DECLARE @_id as int

if exists(select 1 from JTrack_Visitors WHERE cookie = @cookie)
begin
    UPDATE JTrack_Visitors 
    SET LastSeen = @_now 
    WHERE cookie = @cookie
end
else
begin
    INSERT INTO JTrack_Visitors(Cookie, CreatedOn, LastSeen)
    VALUES (@cookie, @_now, @_now)
end
如何将
@\u id
设置为正在插入或更新的行的标识?我需要该值以便稍后在存储过程中使用


谢谢。

根据您使用的SQL Server版本,您可以使用include the OUTPUT子句来获取您要查找的值。
这也将消除检查是否存在以及更新或插入的需要。

您可以在这两个语句中使用OUTPUT子句,在这两种情况下,填充一个表变量,然后从该表变量中检索值

DECLARE @_id as int;
DECLARE @ID_Table TABLE(ID INT);

IF EXISTS (select 1 from JTrack_Visitors WHERE cookie = @cookie)
  BEGIN
       UPDATE JTrack_Visitors 
         SET LastSeen = @_now 
       OUTPUT inserted.ID INTO @ID_Table(ID)
       WHERE cookie = @cookie
  END
ELSE
  BEGIN
    INSERT INTO JTrack_Visitors(Cookie,CreatedOn,LastSeen)
    OUTPUT inserted.ID INTO @ID_Table(ID)
    VALUES (@cookie,@_now,@_now)
  END

SELECT @_id = ID FROM @ID_Table;

需要在2005年得到支持。有没有不使用MERGE的方法可以做到这一点?您可以在更新之后和INSERT语句之后立即使用SELECT@\u id=SCOPE\u IDENTITY()。将inserted.id输出到@id\u Table(id)中会给我提供无效的列名“id”。使用
inserted。[您的_IDENTITY\u column\u name]
而不仅仅是
id
,我仅用于演示目的