Update con campo da aggiornare variabile

mercoledì 02 febbraio 2005 - 20.13

s_dimaio Profilo | Junior Member

E' possibile creare un'istruzione SQL di update dove il campo che viene aggiornate cambia a seconda del valore di una determinata variabile? Qualcosa del tipo se il campo "a" è "true" allora aggiorna il campo "b" a 1, altrimenti aggiona il campo "c" a 1.

Ciao e grazie

Brainkiller Profilo | Guru

Non lo so, ma non credo.
Perchè non fare due o tre Update separate ?
UPDATE Tabella SET ... WHERE Condizione1
UPDATE Tabella SET ... WHERE Condizione2
UPDATE Tabella SET ... WHERE Condizione3

C'è il CASE che potrebbe fare una cosa del genere ma io l'ho sempre usato nelle SELECT.

ciao
david

s_dimaio Profilo | Junior Member

Ho due tabelle in MySql:
- la prima tabella contiene il campo della seconda tabella che deve essere aggiornato e la data alla quale dovrà essere aggiornato;
- la seconda tabella è l'oggetto dell'update di cui sopra.

Faccio una select sulla prima tabella per vedere se c'è qualche campo da aggionare confrontando la data con quella odierna e metto i risultati in un dataset.

Ciclo il dataset e per ogni riga che deve essere aggiornata creo come suggerivi tu la relativa stringa SQL per l'update della seconda tabella.

Solo così risulta un po' pesante, coprattutto se cominciamo a ragionare su 2000-3000 record.

Volevo sfruttare la possibilità dell'uupdate su più tabelle però non riesco a trovare il modo di indicare un campo da aggiornare variabile.

Ho provato con il case però funziona solo per esempio:

UPDATE tabella SET campo1 = CASE ...

io invece cerco il modo di intervenire subito dopo il SET. Qualche sugerimento? Sono anche disposto a rivedere la stuttura del database se necessario.

Ciao e grazie

Brainkiller Profilo | Guru

Credo che non funzioni proprio così come hai indicato.
Evidentemente devi trovare un metodo migliore. Con i 2000/3000 record però quante query di update vai ad effettuare ? In un certo senso anche usando un case dopo il SET SQL Server trasformerebbe l'operazione in più query di Update non credo in una unica e quindi il tempo macchina per aggiornare i dati sarebbe comunque cospicuo.

Mi riservo comunque l'opzione di chiedera ad un collega se è possibile ciò che desideri, appena ho risposta ti faccio sapere.

ciao
david

s_dimaio Profilo | Junior Member

Sono reduce da una dura sperimentazione sulle prestazioni di MySql e ho notato questo. Se faccio un update di 3000 righe usando 3000 istruzioni di update (oppure mettendo tutto in un dataset e chiamando il metodo update) i tempi di aggiornamento sono parecchio lunghi (7 - 10 sec.). Addiritura ho notato che l'UpdateCommand con dataset è la soluzione più lenta di tutte, persino più lenta del commandbuilder...(anche se mi viene da pensare che questo sia colpa soprattutto del dataprovider Connector Net che magari è ancora da perfezionare).

Se invece faccio una sola istruzione di update con gli IF (non ho usato il case ma direi che il discorso non cambia) ed un'unica executenonquery i tempi si accorciano notevolmente (0,3 secondi o giù di lì).

Ecco perchè quando mi trovo su tabelle dove c'è il rischio di andare a lavorare su migliaia di dati, cerco sempre di portare il più possibile all'interno di una stringa SQL.

Solo che questa volta faccio parecchio fatica...

Brainkiller Profilo | Guru

Si in effetti così si, perchè ogni volta dev'essere fatto un bassaggio dal Database Server al Data Provider e a .NET e anche ad anadare indietro.
Probabilmente eseguendo in un cursore o in altro modo su MySQL queste query di update ci metterebbe molto meno tempo, forse non 0,3 ma poco di più.

Però in teoria se tu guardi la documentazione del CASE su MySQL, ammesso che tu non l'abbia già fatto, dovrebbe mostrarti tutti i possibili esempi dell'uso di CASE.

ciao
david

s_dimaio Profilo | Junior Member

La documentazione l'ho letta però il caso viene usato al pari dell'IF dopo che si è deciso il campo da aggiornare...ma parlami di quel discorso sull'eseguire tutto in un cursore che la cosa mi interessa. Cosa intendi e dove è che posso leggere qualcosa al riguardo?

Cteniza Profilo | Guru

Non si possono utilizzare stored procedure su mysql, almeno fino alla prossima versione 5.
Anche per l'utilizzo dei cursori lato server ho qualche dubbio che tu senza stored possa utilizzarli in modo appropriato per quello che vorresti fare

s_dimaio Profilo | Junior Member

Confermo, anche i cursori lato server saranno implementati nella versione 5 di MySql.

Se voi dovreste realizzare un progetto come questo a cui sto lavorando, come organizzereste il database?

Cteniza Profilo | Guru

Senza stored / trigger procedure metterei un campo "data ultima modifica" sulla tabella (not null), ci metterei sopra un indice fatto da: data + codice così l'estrazione dei records da aggiornare diventerebbe molto semplice.
Fondamentale però per la cosa (purtroppo non conosco mysql) è la possibilità di ottenere la data/ora dal server e non dal client.

s_dimaio Profilo | Junior Member

...non ho capito nulla...

Il mio obiettivo è aggiornare determinati campi della Tabella 2 a determinate date.
Ora registro tutti i valori di aggiornamento, i campi da aggiornare e la data nella Tabella 1. Ogni giorno una Sub controlla la Tabella 1, tira fuori i dati con scadenza oggi e aggiorna la Tabella 2.

Tu come è che imposteresti la cosa? Useresti due tabelle come me oppure una unica?

Cteniza Profilo | Guru

Se ho capito bene tu vuoi costruirti una query che agisca su campi divesi a seconda di quanto scritto su una certa tabella.
Ti fai un generatore di query che estrae i dati con i nomi delle tabelle / campi e si genera una o più query di aggiornamento che poi esegui in sequenza.
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5