If not exists

martedì 14 agosto 2007 - 07.49

_J_ Profilo | Senior Member

ciao ragazzi,
per esigenze di programmazione mi ritrovo a scivere una stored procedure che fa un lavoro così:

se in 'miatabella' esiste 'miocampo' allora aggiorna 'miocampo', sennò in 'miatabella' inserisci 'miocampo'

so che esiste la clausola 'if not exists', ma ho dei dubbi perchè la vedo sempre abbinata alla create table, e non a campi o ad insert o update...

qualcuno di voi potrebbe chiarirmi la situazione?

grazie in anticipo
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

lbenaglia Profilo | Guru

>se in 'miatabella' esiste 'miocampo' allora aggiorna 'miocampo',
>sennò in 'miatabella' inserisci 'miocampo'
>
>so che esiste la clausola 'if not exists', ma ho dei dubbi perchè
>la vedo sempre abbinata alla create table, e non a campi o ad
>insert o update...
>
>qualcuno di voi potrebbe chiarirmi la situazione?

Ciao _J_,

in attesa che SQL Server 2008 introduca il comando MERGE (presente in molti altri DBMS), potresti fare l'UPDATE e se @@ROWCOUNT risulta uguale a 0 significa che non c'erano righe da aggiornare, quindi puoi procedere all'INSERT.

In pseudocodice:

UPDATE tabella SET... WHERE... IF @@ROWCOUNT = 0 BEGIN INSERT tabella VALUES... END

>grazie in anticipo
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

_J_ Profilo | Senior Member

ciao lorenzo!

io ho scritto questo codice:

ALTER PROCEDURE [dbo].[ins_domicilio]
(
@cod_p int,
@data_v datetime,
@via int,
@num varchar(4),
@flag varchar(1),
@scala varchar(1),
@piano int,
@interno int
)

AS
insert into abita_in
(
cod_persona, cod_via, num_civico, data_variaz_domicilio
)

values
(
@cod_p,
@via,
@num,
@data_v
)


if not exists(select cod_via,num_civico from domicilio where (cod_via=@via and num_civico=@num))

insert into domicilio
(
cod_via, num_civico, flag_domicilio_corrente, n_scala, n_piano,n_interno
)

values
(
@via,
@num,
@flag,
@scala,
@piano,
@interno
)

else
update domicilio
set cod_via=@via, num_civico=@num, flag_domicilio_corrente=@flag, n_scala=@scala, n_piano=@piano,n_interno=@interno

RETURN

i parametri li imposto lato c#, e quando li impongo fissi (ad es @cod_p="1", @via="5" ecc) mi funziona, nel momento in cui li prelevo da textbox o label mi contesta il formato di input (formato della stringa di input errato), sebbene io rispetti appieno i tipi dei parametri in base ai tipi dei campi delle tabelle nelle query...
non è che conta anche l'ordine con cui scrivo i parametri nella stored?

intanto grazie per il tuo post... ma toglimi una curiosità: cosa significano le due @ prima di rowcount
te lo chiedo perchè ho sempre visto una sola @(per i parametri), @@ non l'ho mai usato, quindi non se so tantissimo..
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

lbenaglia Profilo | Guru

>i parametri li imposto lato c#, e quando li impongo fissi (ad
>es @cod_p="1", @via="5" ecc) mi funziona, nel momento in cui
>li prelevo da textbox o label mi contesta il formato di input
>(formato della stringa di input errato), sebbene io rispetti
>appieno i tipi dei parametri in base ai tipi dei campi delle
>tabelle nelle query...
>non è che conta anche l'ordine con cui scrivo i parametri nella
>stored?
Non ho capito niente
Utilizza SEMPRE la classe sqlCommand per richiamare una stored procedure parametrica, valorizzando ogni singolo paramentro all'interno della collection Parameters PRIMA di eseguire la stored procedure.
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

>intanto grazie per il tuo post... ma toglimi una curiosità: cosa
>significano le due @ prima di rowcount
>te lo chiedo perchè ho sempre visto una sola @(per i parametri),
>@@ non l'ho mai usato, quindi non se so tantissimo..
@@ identifica le funzioni di sistema (una volta chiamate variabili globali).
Tieni presente che con la tecnica che ti ho proposto ti risparmi una SELECT.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

_J_ Profilo | Senior Member

>Utilizza SEMPRE la classe sqlCommand per richiamare una stored
>procedure parametrica, valorizzando ogni singolo paramentro all'interno
>della collection Parameters PRIMA di eseguire la stored procedure.

è proprio quello che faccio...
aggiungo i parametri al sqlcommand e ne specifico il nome ed il tipo, rispettando i nomi e i tipi specificati nella stored.. ma mi contesta la natura dei parametri
i parametri li definisco tutti così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

quello che volevo dire prima (scusami se sono stato poco chiaro) è che se scrivo invece:
adatt.SelectCommand.Parameters["@cod_p"].Value = "15" //valore al posto del controllo
la stored mi funziona...


>@@ identifica le funzioni di sistema (una volta chiamate variabili
>globali)>Tieni presente che con la tecnica che ti ho proposto ti risparmi
>una SELECT.
>
tutto chiaro! grazie! sei stato gentilissimo!
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

lbenaglia Profilo | Guru

>quello che volevo dire prima (scusami se sono stato poco chiaro)
>è che se scrivo invece:
>adatt.SelectCommand.Parameters["@cod_p"].Value = "15" //valore
>al posto del controllo
> la stored mi funziona...
Ah boh, non ne ho idea.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

_J_ Profilo | Senior Member

>Ah boh, non ne ho idea.

ok, grazie cmq
ciao
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."
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-2013
Running on Windows Server 2008 R2 Enterprise, SQL Server 2008 & ASP.NET 3.5