Hur använder jag @@identity mot SQL server för att returnera ID på en INSERT? Här kommer ett litet exempel på en procedur. Kom bara ihåg att @@identity inte är connection specific .. Precis som det nämns ovan så har jag haft lite funderingar huruvida jag kan vara säker på att det är rätt ID som returneras. > Kom bara ihåg att @@identity inte är connection specific @@identity
Går det att använda i en Stored Procedure?
Undrar
/LenaSv: @@identity
Sedan är det bara att hämta Outputparametern (så slipper du recordset).
<code>
Create Procedure spNamn
@variabel [varchar](20),
@Output [int] OUTPUT
AS
INSERT INTO
tabell
(
fält
)
VALUES
(
@variabel
)
IF @@Error <> 0
BEGIN
SET @Output = -1
END
ELSE
BEGIN
SET @Output = @@identity
END
</code>Sv: @@identity
Det innebär att om någon gör en insert i databasen precis innan du plockar upp din @@identity, så finns det en risk att du får fel värde ..
vänta inte med att ta ut det speciellt länge ..
<code>
Create Procedure spNamn
@variabel [varchar](20),
@Output [int] OUTPUT
AS
declare @lastID int
INSERT INTO
tabell
(
fält
)
VALUES
(
@variabel
)
set @lastid = @@identity
IF @@Error <> 0
BEGIN
SET @Output = -1
END
ELSE
BEGIN
SET @Output = @@identity
END
</code>Sv: @@identity
Jag ställde frågan även på chaten och fick där ett väldigt användbart exempel av Trash
som ser ut såhär:
<code>
CREATE PROC add_adb_additionalbookings
@userid int, @itb_id int, @adi_id int, @usr_id int, @adb_amount money, @adb_price money
AS
SET NOCOUNT ON
INSERT INTO [adb_additionalbookings]
(
[itb_id],
[adi_id],
[usr_id],
[adb_amount],
[adb_price],
[updated_by],
[created_by]
)
VALUES
(
@itb_id,
@adi_id,
@usr_id,
@adb_amount,
@adb_price,
@userid,
@userid
)
-- Return the inserted record where adb_id is the new identity
SELECT *
FROM [adb_additionalbookings]
WHERE [adb_id] = SCOPE_IDENTITY()
</code>
Mer information om skillnaderna mellan @@IDENTITY, IDENT_CURRENT('tablename') och SCOPE_IDENTITY() finns här:
http://www.sqlteam.com/item.asp?ItemID=319
Tack för hjälpen!
/LenaSv: @@identity
Eeh, jo det är den visst. @@identity och scope_identity() returnerar bägge det senast skapade identity-värdet i den aktuella sessionen, skillnaden är att scope_identity() håller sig till aktuellt scope. Dvs om en insert gör att en trigger körs, vilken i sin tur gör en insert i an annan tabell så får man med scope_identity() värdet från den första tabellen, med @@identity värdet från den andra tabellen.
IDENT_CURRENT() returnerar det senast skapade identity-värdet för en specifik tabell, oberoende av session och scope.