Just nu i M3-nätverket
Jump to content

Stored Procedures


ns

Recommended Posts

Nu har jag väntat länge nog med att försöka lära mig Stored Procedures men nu är det dags.

Var kan jag läsa en enkel kom igång guide i ämnet?

 

Det jag ska använda min första SP till är att lägga in 6500 relaterade poster i 4 olika tabeller där viss info plockas från en annan tabell och därefter behandlas lite (slås ihop med ett par andra tal och sedan utökas med en modul 10 checksiffra). Hur ska jag tänka? Gör det att göra rena funktioner i SP-koden för att som i mitt fall räkna fram en checksiffra?

 

Säg till om jag behöver vara mer specifik.

 

/Niklas

Link to comment
Share on other sites

om du har MSSQL så finns det information i BooksOnline, där står rätt mycket.

 

Du kan göra det mest i en SP, om det sedan är så smart vet jag inte, men visst kan du göra en SP som räknar fram en checksiffra till dig.

 

- Magnus

-----------------------------------------------------

ju mer jag lär mig ju mer inser jag så lite jag kan

 

Link to comment
Share on other sites

Magnus Ahlkvist

Att skriva kod för Stored Procedures är samma sak som att skriva kod i Query Analyzer och köra den. I princip.

Funktioner kan du inte skapa inuti en SP, däremot kan du i MSSQL2000 skapa funktioner (med ganska begränsad funktionalitet). För att räkna fram en checksiffra är en funktion i MSSQL2000 förmodligen någotsånär optimal.

Håller med om att Books Online är det bästa stället att titta - möjligen finns det någon "SP for Dummies"-bok, men de brukar oftast vara så omständiga och framförallt så begränsade att det nog är lättare att kasta sig rätt in i lejongropen direkt.

När jag skriver Stored Procedures brukar jag alltid börja med att helt enkelt lösa en del av problemet i Query Analyzer, bygga ut min lösning, och när jag har ett script som fungerar lägger jag till kod för att skapa en procedur av scriptet (CREATE PROC procNamn(parameterlista) AS)

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Link to comment
Share on other sites

Nu är jag tyvärr ny på att skriva kod i Query Analyzer också, jag har bara använt den till att testa ensamstående SQL-satser.

 

Nu har jag kommit igång lite iallafall med WHILE och jag lyckas göra mina relaterade INSERTS med hjälp av @@identity.

 

Men det återstår fortfarande att göra beräkningen av checksiffran som ska läggas till på ett värde och sedan användas i en INSERT. Då ska jag först plocka ut ett värde med en SELECT för att sedan behandla det. Men hur får jag det med SELECTen hämtade värdet in i en variabel? Det borde ju vara simpelt, men jag hittar inget om det.

 

/Niklas

 

Link to comment
Share on other sites

Ja, va enkelt! Jag gissade att det var så man skulle göra men fick felmeddelande eftersom jag inte hade med parenteserna.

 

/Niklas

 

Link to comment
Share on other sites

Nu tycker jag att jag fått till uträkningarna, men det tycker inte Query Analyzern som inte gillar denna raden:

SET @intsumma = CAST(SUBSTRING(@strkort, LEN(@strkort) - @counter + 1, 1) AS int) * @mult

utan @intsumma blir NULL.

@strkort är en numerisk sträng på 11 tecken, @counter går mellan 1 och 11 och @mult växlar mellan 1 och 2.

 

Kan någon förklara varför det blir som det blir?

 

/Niklas

 

Link to comment
Share on other sites

Nästa problem. Checksiffran är fixad och gör jag en loop i Query Analyzern så funkar allt perfekt, men när jag flyttar över till en SP (lägger bara till "CREATE PROC spNamn AS" överst och skapar en SP) så går den bara igenom två och ett halvt steg i loopen jämfört med 6500 steg i Query Analyzern. Jag får inget felmeddelande utan det som händer är att jag inte får in alla poster jag vill.

 

Nästa fråga är om det finns någon enkel funktion för att få fram fyrsiffriga PIN-koder. Jag har hittat RAND men hur gör jag enklast för att få ut en fyrsiffrig kod med den? Eller finns det någon annan funktion som ni rekommenderar?

 

Sen en sak till. I min loop plockar jag ut ett löpnummer i en tabell som jag sparar i en variabel och sen kör jag en UPDATE på tabellen för att öka löpnumret med 1. Har jag då extrem otur kommer ju någon in på webben samtidigt och plockar ut samma löpnummer innan min UPDATE körts. Hur kan jag låsa tabellen för läsning under den korta stunden jag gör min SELECT och UPDATE?

 

/Niklas

 

Link to comment
Share on other sites

Magnus Ahlkvist

Varför inte din procedur funkar likadant som scriptet kan jag inte svara på - det borde den göra. Något variabelvärde som du missat sätta?

 

Sen en sak till. I min loop plockar jag ut ett löpnummer i en tabell som jag sparar i en variabel och sen kör jag en UPDATE på tabellen för att öka löpnumret med 1. Har jag då extrem otur kommer ju någon in på webben samtidigt och plockar ut samma löpnummer innan min UPDATE körts. Hur kan jag låsa tabellen för läsning under den korta stunden jag gör min SELECT och UPDATE?

 

Använd en transaktion för att låsa tabellen. Det bör du iofs göra ändå, bara för att kunna rulla tillbaka hela transactionen om något går fel, så att du inte har uppdaterat i ena tabellen men sen inte lyckas uppdatera i den andra.

Läs i Books OnLine om olika låsningar till transactioner.

 

Sök på "BEGIN TRANSACTION" och "SET TRANSACTION ISOLATION LEVEL" för att se syntaxer och förklaringar i Books OnLine.

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...