StevePMedlem sedan mars 2003772 inlägg 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?
StevePMedlem sedan mars 2003772 inlägg kan jag inte göra nåt i denhär stilen?
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?
LarsGMedlem sedan dec. 200012 464 inlägg 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
Du får nog fila lite på flehanteringen
StevePMedlem sedan mars 2003772 inlägg Det ser ju lite smidigare ut att ha allt i en SP
Jag testar, tack!
StevePMedlem sedan mars 2003772 inlägg Vad är
select @serial = [b]coalesce[/b](max(serial),0) + 1
samt
(holdlock)
LarsGMedlem sedan dec. 200012 464 inlägg 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.
StevePMedlem sedan mars 2003772 inlägg Ah suveränt!
Vad gör "Nollan" framför +1 ?
Är det värdet som sätts in genom "coalesce" om det inte finns nåt matchande ContactID ?