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
Aiuto per comando sql complesso
mercoledì 07 marzo 2007 - 19.06
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
fabiogvn
Profilo
| Newbie
47
messaggi | Data Invio:
mer 7 mar 2007 - 19:06
Dovrei verificare molto spesso se alcuni campi di una serie di record sono stati modificati e, in caso affermativo, eseguire l'update. Al momento lo sto facendo inviando due comandi SQL, uno per recuperare il record da modificare e verificare se è stato modificato e, in caso affermativo, un secondo comando per l'update vero e proprio. Ovviamente così è poco funzionale, oltre che, immagino, più lento. Vorrei quindi creare un unico comando SQL e magari poi memorizzarlo in una stored procedure, per velocizzare al massimo il tutto.
La mia esigenza è questa:
"SELECT a, b FROM tabella WHERE Id=" + Id
"IF a<>" + Variabile_a + " OR b<> " + variabile_b
UPDATE ECC. ECC.
Id, variabile_a e Variabile_b saranno poi da aggiungere come parametri dell'eventuale storage procedure, per il momento sono semplicemente da concatenare alla stringa di comando da inviare
Come lo traduco in linguaggio SQL?
Ah dimenticavo, sto utilizzando SQL Server 2005
Grazie
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mer 7 mar 2007 - 23:00
>Dovrei verificare molto spesso se alcuni campi di una serie di
>record sono stati modificati e, in caso affermativo, eseguire
>l'update. Al momento lo sto facendo inviando due comandi SQL,
>uno per recuperare il record da modificare e verificare se è
>stato modificato e, in caso affermativo, un secondo comando per
>l'update vero e proprio.
Ciao fabiogvn,
non ho capito bene "il giro del fumo"
Tu hai una applicazione che si connette ad una base dati.
Questa applicazione interroga la base dati ottenendo un certo result set.
Che senso ha reinterrogare la base dati andando ad aggiornare le righe recuperate in precedenza se qualcun altro le ha modificate?
>Grazie
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
fabiogvn
Profilo
| Newbie
47
messaggi | Data Invio:
gio 8 mar 2007 - 09:31
Da quello che hai capito mi rendo conto di essermi spiegato sufficientemente male! :-)
Il "fumo" fa questo giro:
Io ho una base dati che deve essere aggiornata spesso da un servizio SOAP (e solo da quello), in pratica un'applicazione esterna deve mantenere aggiornati una serie di dati su un server SQL la quale verrò poi interrogata da varie pagine web per la consultazione read only di questi dati.
Come spiegavo prima, il punto da ottimizzare è l'aggiornamento di questa base dati, in quanto deve avvenire molto spesso e coinvolge moltissimi record.
La procedura è la seguente:
L'applicazione esterna invia la serie di dati da aggiornare, diciamo per semplicità che ogni dato corrisponde ad un record, e la pagina contenente il servizio SOAP deve:
- Controllare uno ad uno se i dati ricevuti sono già presenti nel database tramite una SELECT
- Se non sono presenti esegue un INSERT
- Se sono presenti esegue un UPDATE ma solo se i dati recuperati dalla SELECT precedente sono diversi da quelli ricevuti
Quindi, in codice:
SELECT a,b FROM tabella WHERE Id=MyId
IF nonesisteilrecord
INSERT.....
ELSEIF a<>My_a OR b<>My_b
UPDATE...
Non ho problemi a farlo tamite comandi SQL direttamente dalla pagina del servizio, ma il mio post era per capire se era possibile farlo tramite un unico comando SQL in modo da far fare direttamente al server la verifica dell'esistenza del record e dei dati modificati, per arrivare alla fine a salvare il tutto in una stored procedure che accetta come parametri l'Id del record e due dati a e b. Immagino che in questo modo sarebbe più veloce, e siccome i record da analizzare sono veramente molti e la procedura viene richiamata spesso, la velocità di esecuzione sarebbe un punto cruciale
E' possibile? E se si, come??
Spero di essermi spiegato meglio
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
gio 8 mar 2007 - 11:28
>...e la pagina contenente il servizio SOAP deve:
>
>- Controllare uno ad uno se i dati ricevuti sono già presenti
>nel database tramite una SELECT
>- Se non sono presenti esegue un INSERT
>- Se sono presenti esegue un UPDATE ma solo se i dati recuperati
>dalla SELECT precedente sono diversi da quelli ricevuti
Perché?
La prima SELECT non serve.
Fai una UPDATE, se @@ROWCOUNT = 0 significa che non hai aggiornato alcuna riga, quindi farai l'INSERT.
Incapsuli tutto in una sp parametrica che richiamerai dal WS e hai finito
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
fabiogvn
Profilo
| Newbie
47
messaggi | Data Invio:
gio 8 mar 2007 - 14:24
Bene, riguardo all'insert mi hai dato un ottimo suggerimento.
Riguardo all'update invece, per evitare di farlo su record che non sono stati modificati, credo che implementerò un controllo a monte in modo che l'applicazione mandi solamente dati effettivamente modificati rispetto all'ultimo invio.
Grazie, ciao
Fabio
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 !