Inserire solo record univoci

mercoledì 07 novembre 2007 - 13.46

dexx Profilo | Newbie

ciao,
da qualche giorno devo lavorare su un programma C# di comparazione di DataBase SQLServer 2005/2000.
Dopo aver comparato i due database, devo generare degli script sql per aggiornare quello a cui manca qualcosa.
Supponiamo che al secondo database manchi la colonna Data (presente invece nel primo) in una particolare tabella : creo la colonna nella tabella, e poi faccio gli insert delle righe del database1 nel 2.
Devo però controllare che nel database2 non vengano inseriti record duplicati.... cioè devo fare l'insert solo dei record la cui chiave primaria non è presente nel DataBase2.

Avrei bisogno di un codice simile a questo credo.....

IF NOT EXISTS (SELECT * FROM sysobjects WHERE NAME='PA_ANNO' AND xtype='U')
CREATE TABLE [PA_ANNO] ([NOME] [varchar] (50) NULL )

che è il codice che uso per creare la tabella....ma per controllare gli eventuali doppioni prima di fare l'insert

qualcuno sa qualcosa?

alx_81 Profilo | Guru

>ciao,
Ciao!

>da qualche giorno devo lavorare su un programma C# di comparazione
>di DataBase SQLServer 2005/2000.
>Dopo aver comparato i due database, devo generare degli script
>sql per aggiornare quello a cui manca qualcosa.
>Supponiamo che al secondo database manchi la colonna Data (presente
>invece nel primo) in una particolare tabella : creo la colonna
>nella tabella, e poi faccio gli insert delle righe del database1
>nel 2.
>Devo però controllare che nel database2 non vengano inseriti
>record duplicati.... cioè devo fare l'insert solo dei record
>la cui chiave primaria non è presente nel DataBase2.
>
>Avrei bisogno di un codice simile a questo credo.....
>
>IF NOT EXISTS (SELECT * FROM sysobjects WHERE NAME='PA_ANNO'
>AND xtype='U')
>CREATE TABLE [PA_ANNO] ([NOME] [varchar] (50) NULL )
>
>che è il codice che uso per creare la tabella....ma per controllare
>gli eventuali doppioni prima di fare l'insert
>qualcuno sa qualcosa?
Puoi usare sempre la EXISTS:


IF NOT EXISTS (Select * from TabellaDestinazione WHERE Campo1 = Valore1 AND Campon = Valoren) INSERT INTO TabellaDestinazione (Campo1, Campon) VALUES (Valore1, Valoren)

Con la stessa logica puoi agire sulla chiave primaria, se ti basta come controllo..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

dexx Profilo | Newbie

il problema è che devo generare questi script in modo automatico..... validi per tutte le tabelle.
Non so a prori qual'è la chiave primaria della tabella ....

con questo codice:

--nome colonna PK
DECLARE @Nome_PK as varchar(100)

select @Nome_PK = c.name
from sysindexes i
join sysobjects o ON i.id = o.id
join sysobjects pk ON i.name = pk.name
AND pk.parent_obj = i.id
AND pk.xtype = 'PK'
join sysindexkeys ik on i.id = ik.id
and i.indid = ik.indid
join syscolumns c ON ik.id = c.id
AND ik.colid = c.colid
where o.name = 'PA_CLIENTE'

recupero il nome della chiave primaria, ma quando faccio


IF NOT EXISTS (Select @Nome_PK, Nome from PA_CLIENTE where @Nome_PK=111)
INSERT INTO [PA_CLIENTE] ( [ID_PA_CLIENTE], [NOME], [COGNOME], [ETA] ) VALUES ( 111, 'Luca ', 'Toni ', '12 ' )


mi dice che non posso usare where @Nome_PK=111 ....... mentre mii funziona mettendo where ID_PA_CLIENTE=111 che non è quello che voglio

lbenaglia Profilo | Guru

>IF NOT EXISTS (Select @Nome_PK, Nome from PA_CLIENTE where @Nome_PK=111)
>INSERT INTO [PA_CLIENTE] ( [ID_PA_CLIENTE], [NOME], [COGNOME],
>[ETA] ) VALUES ( 111, 'Luca ', 'Toni ', '12
>' )
>
>
>mi dice che non posso usare where @Nome_PK=111 ....... mentre
>mii funziona mettendo where ID_PA_CLIENTE=111 che non è quello
>che voglio

I nomi delle colonne non sono parametrizzabili.
Una veloce (e sporca) soluzione consiste nel comporre dinamicamente una stringa contenente il comando ed eseguirlo mediante EXEC.

Ciao!

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

dexx Profilo | Newbie

mi potresti fare un esempio per capirci???
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5