Avatar billede dmk Nybegynder
14. juni 2004 - 09:50 Der er 5 kommentarer

Rowversion værdi

Kan man trække værdien ud for den rowversion værdi der bliver indsat i en insert eller update statement?

Hvis man bruger en datetime i stedet, kan man selv generere værdien før man laver sin update eller insert. Hvis man bruger en identity kan man aflæse denne værdi efter insert med @@identity. Men hvis man bruger en rowversion, og har brug for denne værdi bagefter, bliver man så nødt til at aflæse værdien bagefter med en select-statement? Det kræver 2 statements for hver insert og update, og det vil være grimt!

@@DBTS virker desværre ikke, da den er server-wide, så den værdi man får fat i er ikke nødvendigvis værdien for den insert man selv har lavet.
Avatar billede janus_007 Nybegynder
16. juni 2004 - 00:31 #1
hmm njaaa... Må jeg spørge i hvilken forbindelse du vil bruge det?

sp, sprog og hvorfor?
Avatar billede trer Nybegynder
17. juni 2004 - 09:05 #2
Du kan tilføje en kolonne med datatypen ROWVERSION - der får du så adgang til at se værdien. Bemærk at du kun kan læse fra den kolonne - ud kan ikke opdatere.

Det er beskrevet nærmere hvordan du sætter kolonnen op i Books Online som er en del af klientværktøjerne (Query Analyzer og Enterprise Manager) til SQL Server.
Avatar billede dmk Nybegynder
17. juni 2004 - 14:59 #3
Nej, problemet er at jeg har en masse stored procedures der opretter eller ændrer data. Hele interfacet til min database foregår igennem et sæt stored procedures.

Et eksempel på en stored procedure til indsættelse:

create table SomeTable (
    ID        integer identity primary key,
    Data      varchar(200),
    Version  RowVersion
);

create procedure InsertSomeData (
  @InsertedID  integer output,
  @Data        varchar(200),
  @Version    RowVersion output
) as
begin
  insert into SomeTable (Data)
  values (@Data);

  set @InsertedID=@@IDENTITY;

  select @Version=Version
  from SomeTable
  where ID=@InsertedID;

end
go


Som det ses, kan jeg aflæse primary key, så jeg kan returnere ID'et for den row jeg har indsat. Men RowVersion kolonnen bliver jeg nødt til at aflæse med en ny select-sql, og dette bliver jo så til endnu en SQL for at aflæse noget jeg lige har indsat. Æv.
Avatar billede trer Nybegynder
27. august 2004 - 16:18 #4
Der findes en global variabel (mener den hedder @@dbts) som indeholder den sidst anvendte rowversion værdi...
Avatar billede dmk Nybegynder
18. januar 2005 - 12:29 #5
Rigtig godt bud, men den er desværre pr. database, og er ikke knyttet til den aktuelle transaktion. Hvis jeg aflæser den lige efter min insert, vil jeg få den værdi der er blevet indsat, MED MINDRE der er en anden transaktion der har opdateret den i mellemtiden. Så får jeg den forkerte værdi.
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