Aiuto per comando sql complesso

mercoledì 07 marzo 2007 - 19.06

fabiogvn Profilo | Newbie


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

>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

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

>...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

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
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5