Jag har en tabell med en massa poster i.
Primary keyn är PostID
Användaren styrs genom "ContactID"
Sen finns ett fält som heter "serial"
När jag nu ska göra en ny Insert så måste jag ta reda på det Högsta "serial" värdet för dom posterna som har ContactID't som är bundet i querystringen, och plussa på "1"
Så om den högsta posten som finns just nu har
ContactID
16
Serial
1000
Så ska nästa post bli
ContactID
16
Serial
1001
Men jag kan inte använda Autoincrement på "serial" eftersom flera poster kan ha samma serial men olika ContactID's.
nån ide?
Jag skapar först MaxSerial i asp sidan, ungefär såhär
Select
Max(Serial) as MaxSerial
from
tblPostList
Where ContactID = "& Request.Querystring("ContactID")
Sen Sp'n
--SP'n
@ContactID INT,
@Serial INT
@MaxSerial = @MaxSerial +1
AS
Insert
into tblPostList
(ContactID, Serial)
Values
(@ContactIDVariable, @MaxSerial)
GO
Men jag vet inte riktigt hur jag ska få ut Maxserial ur den första queryn och lägga in den i den andra och plussa på ett?
Men jag kanske tänker i rätt riktning?
Har för mig att du använder SQL server så det är väl bäst att göra en procedur.
create procedure mc_1 @contactId int <,andra parametrar>
as
begin
declare @serial int
begin transaction
select @serial = coalesce(max(serial),0) + 1
from t with (holdlock)
where contactid = @contactid
insert into t values (@serial<,andra värden>)
commit
end
coalesce är för att hantera det fall då det inte finns något matchande contactid i tabellen. Resultatet av max blir då null och mha coalesce så översätts det till 0.
holdlock anger att de rader som har lästs skall förbli låsta tills dess att transaktionen avslutas. Det är ganska väsentligt för att förhindra att flera personer får samma serial-värde.