If exist insert e update

mercoledì 13 gennaio 2010 - 09.29

ilario Profilo | Senior Member

ciao

per evitare di inserire record duplici ho pensato di controllare prima se esiste gia' un record in caso negativo lo inserisco

questo è la store procedure volevo sapere se è giusto così o esiste un modo più corretto

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



il mio problema è nella store di update

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

qui passo il parametro idcaratteri perchè esiste e serve a modificare quel record e restituisco un parametro @idcaratteriUpt -1 se esiste e il @idcarattere se ha fatto l'update

se noncambio tutte due i parametri codice e descrizione mi da sempre file esistente (-1)
è ovvio che può esistere , perchè è in modifica ,
non riesco a trovare la combinazione della select di far controllare tutti i record tranne quello in modifaca = @idcaratteri

spero di essermi spiegato

ciao e grazie
ilario


lbenaglia Profilo | Guru

>spero di essermi spiegato
Ciao Ilario,

Sinceramente non ho capito molto del risultato che vuoi ottenere.
Prima di tutto, che versione di SQL Server utilizzi? Se si tratta di SQL Server 2008 hai provato a dare un'occhiata al comando MERGE?
http://technet.microsoft.com/en-us/library/bb510625.aspx

In futuro posta un esempio completo con la struttura delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato finale che intendi ottenere con quei dati.

>ciao e grazie
Prego.

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

ilario Profilo | Senior Member

<Sinceramente non ho capito molto del risultato che vuoi ottenere.
<Prima di tutto, che versione di SQL Server utilizzi?
sql 2008
Se si tratta di SQL Server 2008 hai provato a dare un'occhiata al comando MERGE?
<http://technet.microsoft.com/en-us/library/bb510625.aspx

vado a dare subito un'occhiata


il mio scopo è semplicemente quello di non inserire in una tabella un doppio record

questa è la tabella

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


store per l'inserimento


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

questa mi restituisce -1 se codicecaratterie e/o descrizione esistono già in un altro record, altrimenti mi inserisce il nuovo record e ritorna il nuovo nr id set @idCaratteri = SCOPE_IDENTITY ()
e questa sembra funzionare dopo le prove che ho fatto volevo solo sapere se è corretta




il mio problema è nella store di update e più esattamente nella select che mi controlla l'esistenza di un record uguale, (dovrebbe controllare tutti i record tranne quello in modifica = idcarattere, perchè ovviamente i dati codice e descrizione sono uguale)

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

adesso vado a studiare Merge

ciao
ilario






ilario Profilo | Senior Member

ciao Lorenzo

ho letto Merge se non ho capito male serve per insert update e delete ma da due tabelle io lo devo fare da una sola tabella

forse ho risolto con

mi dici se è corretto scrivere una select in questo modo?

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

ho fatto una select dove controllo codice e descrizione da una sub select dove ho tolto il record in fase di modifica = @idCaratteri


ciao
ilario

lbenaglia Profilo | Guru

>questa è la tabella
OK

>store per l'inserimento
OK

>il mio problema è nella store di update
Prima ho scritto: "In futuro posta un esempio completo con la struttura delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato finale che intendi ottenere con quei dati."
Mancano dati e risultato finale con quei dati.
Spendi 2 minuti a confezionare il tutto...

Ciao!

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

ilario Profilo | Senior Member

ciao
<Spendi 2 minuti a confezionare il tutto...

scusa mi sono dimenticato i dati

alcuni esempi

insert into Caratteri values('01','Arial');
insert into Caratteri values('05','English');
insert into Caratteri values('10','Times');
insert into Caratteri values('11','Corbel');
insert into Caratteri values('12','Continum');
insert into Caratteri values('14','Copper');


questa è una tabella contenente una serie di caratteri con un codice

devo fare in modo di evitare questo

insert into Caratteri values('14','Copper');

di inserire un record uguale e la store insert sono riuscito il mio dubbio e nell'update

se stò ad esempio modificando il record contenente '10','Times' in '11','times' mi deve dare errore perchè il cod 11 è già in uso con '11','Corbel'

il problema viene fuori se provo a modificare '10','Times' in '50','Times' in teoria dovrebbe accettarlo perchè il codice 50 non è utilizzato da altri record, in pratica mi dà errore perche mi controlla anche la descrizione cioè 'Times' che è presente nel record che sto modificando,
quindi quando faccio la ricerca dell' if exist la devo fare in tutta la tabella escludendo giustamente il record in modifica

alla fine funziona con questa select

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

ma volevo sapere se è corretta o esiste un altro modo



la store diventa questa , mi restituisce -1 se non è andata a buon fine e il numero dell'idcaratteri del record modificato se è andata a buon fine



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


grazie

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