Incremento asincrono

venerdì 12 dicembre 2008 - 11.48

WilOhmsford Profilo | Newbie

Ciao a tutti,

in una tabella di sql server ho un campo "contatore" che viene incrementato ad ogni inserimento di record. Vorrei poi incrementare di 1 valore un altro campo ad ogni incremento di 5 del primo. In altre parole, quando il campo contatore raggiunge un valore multiplo di 5 (e cioé quando contatore % 5 = 0), l'altro campo dovrebbe aumentare di uno e mantenere quel valore fino al successivo incremento.
Il tutto è contenuto in una stored procedure; finora ho utilizzato un if (che controlla lo stato del contatore) associato ad un'istruzione update: effettivamente così, ad ogni multiplo di 5 il valore viene incrementato... ma poi torna quello originario al record successivo!
Come posso fare per mantenerlo costante e dunque pronto per un nuovo incremento?

Grazie per i preziosi suggerimenti!

jenga Profilo | Newbie

non ho capito bene dove viene salvato il secondo campo, ma fare l'aggiornamento con un trigger?
--
oggi la mia voglia di lavorare è pari a null

WilOhmsford Profilo | Newbie

Chiedo scusa per il doppio post, per problemi di caricamento pagina non mi sono accorto di aver cliccato due volte sul pulsante.
Dunque, il secondo campo è sulla medesima tabella. Sono poco ferrato per quanto riguarda i trigger, ma farò subito delle prove e riferirò. Per il momento grazie!

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>in una tabella di sql server ho un campo "contatore" che viene
>incrementato ad ogni inserimento di record. Vorrei poi incrementare
>di 1 valore un altro campo ad ogni incremento di 5 del primo.
>In altre parole, quando il campo contatore raggiunge un valore
>multiplo di 5 (e cioé quando contatore % 5 = 0), l'altro campo
>dovrebbe aumentare di uno e mantenere quel valore fino al successivo
>incremento.
>Il tutto è contenuto in una stored procedure; finora ho utilizzato
>un if (che controlla lo stato del contatore) associato ad un'istruzione
>update: effettivamente così, ad ogni multiplo di 5 il valore
>viene incrementato... ma poi torna quello originario al record
>successivo!
>Come posso fare per mantenerlo costante e dunque pronto per un
>nuovo incremento?
Ti dà problemi se si creano buchi tra un valore del contatore e l'altro? Te lo chiedo perchè alla fine potresti avere intervalli di meno di 5 record e magari la cosa non ti va bene.
Altra cosa, che versione di sql server hai? Perchè secondo me puoi evitare di salvare il valore in tabella ricorrendo alle ranking functions.

>Grazie per i preziosi suggerimenti!
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

WilOhmsford Profilo | Newbie

Ciao,

>Ti dà problemi se si creano buchi tra un valore del contatore
>e l'altro? Te lo chiedo perchè alla fine potresti avere intervalli
>di meno di 5 record e magari la cosa non ti va bene.

Sì, è vero, ci avevo pensato. Però ho fatto in modo che nella colonna contatore sia sempre indicato il numero effettivo di record, perché nella stored procedure ho messo una variabile scalare che per ogni inserimento mi fa il count dei record. In questo modo non si creano buchi.

>Altra cosa, che versione di sql server hai? Perchè secondo me
>puoi evitare di salvare il valore in tabella ricorrendo alle
>ranking functions.

Ho SQL Server 2005 express. Purtroppo sono ancora agli inizi , e non conosco le ranking functions: che cosa sono?

Ad ogni modo alla fine ho fatto un po' di prove e sono riuscito a realizzare un piccolo trigger di inserimento con cui ho risolto il problema: in pratica ad ogni insert mi va a controllare se il valore del contatore è divisibile per 5, e se lo è mi aumenta di uno il valore del secondo campo, altrimenti lo lascia com'è.

Grazie ancora per i suggerimenti

alx_81 Profilo | Guru

>Sì, è vero, ci avevo pensato. Però ho fatto in modo che nella
>colonna contatore sia sempre indicato il numero effettivo di
>record, perché nella stored procedure ho messo una variabile
>scalare che per ogni inserimento mi fa il count dei record. In
>questo modo non si creano buchi.
Ok, ma fai attenzione, perchè la soluzione non scala. Nel senso che all'aumentare dei record potresti ottenere dei rallentamenti in fase di inserimento.

>Ho SQL Server 2005 express. Purtroppo sono ancora agli inizi
>, e non conosco le ranking functions: che cosa sono?
Le ranking functions sono delle funzioni che ti permettono di eseguire delle operazioni di distribuzioni numeriche su una certa partizione definita. Ne esistono di vario tipo.
Ad esempio, potresti voler numerare un insieme raggruppato in un certo modo, oppure definire una classifica, ecc..
Nel nostro caso, potresti usarle per fare gruppi di 5 righe in base al conteggio totale dei record (ad esempio usando la funzione NTILE(<numero di gruppi>)).
Ricalcoleresti ad ogni chiamata il valore del campo, ma non dovresti salvarti un valore sulla tabella.

>Ad ogni modo alla fine ho fatto un po' di prove e sono riuscito
>a realizzare un piccolo trigger di inserimento con cui ho risolto
>il problema: in pratica ad ogni insert mi va a controllare se
>il valore del contatore è divisibile per 5, e se lo è mi aumenta
>di uno il valore del secondo campo, altrimenti lo lascia com'è.
Personalmente non amo per niente i trigger e non li uso praticamente mai. Per vari motivi, legati soprattutto alla scalabilità, alla manutenibilità ed alla visibilità.
Se un tuo collega dovesse modificare quello che hai fatto, se non opportunamente documentato, potrebbe essere un problema trovare il trigger e comunque, prima di arrivarci, ci vuole del tempo. Non è una soluzione che amo, ma se è quello che ti serve, ottimo .

>Grazie ancora per i suggerimenti
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5