Hallå,
vore tacksam om någon kunde hjälpa mig lite med att slumpa nummer.
Jag har en tabell som ska innehålla en form av biljetter.
Varje biljett ska få ett unikt 6-siffrigt ID-nummer av typen INT.
Biljetter ska skapas med en stored procedure.
Hur slumpar jag bäst fram ett ledigt nummer mellan 100000 och 999999?
Man måste ju kolla så att det inte är upptaget i tabellen...
Jag använder SQL Server 2005.
Dock ett otroligt jobbigt sätt att få fram nästa, unika tal. För varje tal som slumpats måste det kollas så att det inte redan finns sparat. Ponera nu att 999998 av 999999 tal finns sparade - hur kul blir det att m.h.a. av en slumpgenerator hitta det sista talet?
Alla ID-nummer måste skapas slumpmässigt och inte sekventiellt.
Man ska alltså inte i förväg kunna gissa sig till vad nästa biljett får för nummer.
Jag inser att detta skapar onödigt mycket jobb men det är en beställning från ovan :P
Ja visst, jag känner redan till diverse funktioner som slumpar fram nummer.
Men det måste ligga exakt mellan 100000-999999 och inte existera i en tabell.
Peter S skrev:
Dock ett otroligt jobbigt sätt att få fram nästa, unika tal. För varje tal som slumpats måste det kollas så att det inte redan finns sparat. Ponera nu att 999998 av 999999 tal finns sparade - hur kul blir det att m.h.a. av en slumpgenerator hitta det sista talet?
Intressant hypotes. Har man otur kan datorn rent teoretiskt hålla på i oändlighet innan den lyckas slumpa fram det lediga talet...
Hm...så onödigt krångligt detta blev.
Ett alternativ är att använda en hash-summa med en fast bredd.
Finns det hash-algoritmer som ger summor som är runt 6-8 tecken?
Det vi skulle vilja göra är att slumpa fram talet är en given mängd. Denna mängd är differensen mellan A = {x | 100000 <= x <= 999999} och B = {x | x e SELECT id FROM tbl}, d.v.s. A \ B.
I SQL Server 2005 finns lyckligtvis EXCEPT som klarar detta. Så genom att först skapa en temporärtabell och sedan köra en EXCEPT mot de redan exiserande id:na, bör du kunna få ett slumpurval.
Skulle man kunna tänka sig att gå andra vägen?
Skapa en tabell med alla godkända nummer. Lägg till ett fält med TS för uttag
Låt en randomfunktion skapa ett 1-4 långt nr som man söker på i den tabellen som har outtagna nr. Kvittera ut det så är det frid och fröjd.
Man kan tänka sig att med hjälp av antalet poster i den nya insatta tbellen välja längd på det man söker med.
Har jag förklarat mig otydligt?
Lasp, du fick mig att tänka i nya banor :D
Man skapar alltså en tabell med färdiga "biljetter", dvs. alla godkända nummer.
Med hjälp av ett fält kan man avgöra om numret är ledigt eller ej.
Att slumpa fram ett ledigt nummer blir då inte svårare än såhär:
SELECT TOP 1 TicketId FROM Tickets WHERE (Status = 0) ORDER BY NEWID()