Avatar billede pfp Nybegynder
07. september 2005 - 16:55 Der er 10 kommentarer og
1 løsning

IDENTITY i Stored Procedure

Hej,

Jeg sidder og roder lidt med en stored procedure i MS SQL.

Jeg vil gerne gemme en @Identity værdi en variabel som skal bruges "længere nede" i min procedure.

CREATE PROCEDURE min_sp
    @Rid int OUTPUT
AS
BEGIN
    SET @Rid = SELECT @@IDENTITY FROM myTable
END

Jeg får fejlen:
Incorrect syntax near the keyword 'SELECT'

Det er første gang jeg prøver at bruge @@Identity, så det kan godt være der er noget jeg har misforstået fuldstændig, men syntes bare de google eksempler jeg har fundet har samme syntax?

Én der kan hjælpe?

På forhånd tak.

--
Med venlig hilsen
Peter F. Poulsen
Avatar billede arne_v Ekspert
07. september 2005 - 17:21 #1
prøv:

SET @Rid = SELECT @@IDENTITY
Avatar billede arne_v Ekspert
07. september 2005 - 17:21 #2
hm - måske:

SELECT @Rid = SELECT @@IDENTITY
Avatar billede claesdamlund Nybegynder
07. september 2005 - 22:36 #3
Burde det ikke være:

CREATE PROCEDURE min_sp
AS
DECLARE @Rid int
BEGIN
    SET @Rid = SELECT @@IDENTITY FROM myTable
END
Avatar billede pfp Nybegynder
07. september 2005 - 22:51 #4
Hej,

Arne jeg fik det til at virke med SELECT @Rid = SELECT @@IDENTITY...Jeg troede bare at jeg kunne bruge den på et vilkårligt tidspunkt og så få seneste record retur, men den skal tilsyneladende anvendes i forbindelse med en INSERT.

Svarer du?
Avatar billede arne_v Ekspert
07. september 2005 - 22:53 #5
svar
Avatar billede arne_v Ekspert
07. september 2005 - 22:53 #6
@@IDENTITY er tilknyttet connection
Avatar billede ldanielsen Nybegynder
08. september 2005 - 12:36 #7
SET @Rid = @@IDENTITY

er den rigtige syntaks

@@IDENTITY indeholder det sidste identity der er genereret på serveren, så du kan kun bruge den i forbindelse med en INSERT:

INSERT INTO myTable DEFAULT VALUES
SELECT @@IDENTITY

- giver altså værdien af en evt. identity-kolonne for den post der netop er oprettet.

@@IDENTITY indeholder det sidste identity der er genereret på serveren! Derfor kan man kun regne med at den er korrekt indenfor en transaction, og så er der vist oven i købet noge med isolation level, som jeg ikke er inde i. Hvis du koder uden at du selv angiver transactions, så vil hele din sp foregå indenfor en transaction.

Derfor bør du altid hente værdien umiddelbart efter din INSERT.
Avatar billede arne_v Ekspert
08. september 2005 - 12:43 #8
@@IDENTITY er per connection og bør ikke påvirkes af transaktioner

nyere SQLServer har SCOPE_IDENTITY() som ofte anbefales (hvis man har
triggers som også laver INSERT !)
Avatar billede pfp Nybegynder
08. september 2005 - 12:50 #9
Jeg fandt også SCOPE_IDENTITY() via google, og det er den jeg har anvendt.

Men tak for de gode forklaringer til jer begge to.
Avatar billede ldanielsen Nybegynder
08. september 2005 - 12:56 #10
Jeg tror du har ret arne_v. BOL siger:

The scope of the @@IDENTITY function is the local server on which it is executed.

- men det betyder bare at man ikke kan få @@IDENTITY til at fortælle værdier genereret på en remote eller linked server.

Det havde jeg misforstået.
Avatar billede arne_v Ekspert
08. september 2005 - 13:08 #11
jeg har aldrig set en database hvor den feature ikke er per connection - ellers
er den jo næsten ubrugelig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester