webForumDet fria alternativet

Update +1 i nästa post.

7 svar · 266 visningar · startad av SteveP

StevePMedlem sedan mars 2003772 inlägg
#1

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
#2

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
#3

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
#4

Det ser ju lite smidigare ut att ha allt i en SP

Jag testar, tack!

StevePMedlem sedan mars 2003772 inlägg
#5

Vad är


select @serial = [b]coalesce[/b](max(serial),0) + 1 

samt

(holdlock)
LarsGMedlem sedan dec. 200012 464 inlägg
#6

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
#7

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 ?

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Jo

128 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)