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.
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.
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.
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.
Synes godt om
Ny brugerNybegynder
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.