Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Incremento asincrono
venerdì 12 dicembre 2008 - 11.48
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
WilOhmsford
Profilo
| Newbie
40
messaggi | Data Invio:
ven 12 dic 2008 - 11:48
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
44
messaggi | Data Invio:
ven 12 dic 2008 - 11:57
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
40
messaggi | Data Invio:
ven 12 dic 2008 - 12:06
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
8.814
messaggi | Data Invio:
ven 12 dic 2008 - 12:31
>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
40
messaggi | Data Invio:
ven 12 dic 2008 - 13:41
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
8.814
messaggi | Data Invio:
ven 12 dic 2008 - 13:53
>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
Torna su
Stanze Forum
Elenco Threads
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 !