Problema creazione query

giovedì 24 luglio 2008 - 09.06

toyo86 Profilo | Junior Member

ciao a tutti..
so che potrebbe sembrare un problema semplice..ma ho delle difficoltà nella creazione di due query..
ho bisogno di prendere dei dati da un database Access (sempre il solito, quello con cui vi stresso da secoli ) e portarli in sql server..allora il primo inserimento riesco a farlo ma poi devo costruire una query che mi aggiorni solamente i dati..
questo devo farlo confrontando un campo dati dal nome D_Agg di sql server con quello di access..
la seconda problematica (ma forse neanche tanto) è su come inserire i dati che non sono già presenti..quindi quelli dove l'id della tabella in access non è presente nella tabella sql server..

grazie per chi mi riesce ad illuminare..
sarà la mattina ma non so come fare...

lbenaglia Profilo | Guru

>devo costruire una query che mi aggiorni solamente i dati..
>questo devo farlo confrontando un campo dati dal nome D_Agg di
>sql server con quello di access..
>la seconda problematica (ma forse neanche tanto) è su come inserire
>i dati che non sono già presenti..quindi quelli dove l'id della
>tabella in access non è presente nella tabella sql server..

Se ho capito bene il problema, te la puoi cavare con una outer join oppure con l'utilizzo della funzione EXISTS.
Devi semplicemente eseguire una query distribuita tra il db Access e quello SQL Server.

>grazie per chi mi riesce ad illuminare..
Prego.

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

toyo86 Profilo | Junior Member

ho provato a costruire questa query...

SELECT * FROM free.dbo.[ANAGRAFICA] AS T
LEFT OUTER JOIN OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source = C:\=MIKI_ORI\DB_Base.mdb; User Id=admin;Password=;')...[ANAGRAFICA] AS S
ON T.[codice anagrafico] != S-[codice anagrafico]


me la valida ma quando la eseguo mi restituisce questo errore..
Messaggio 297, livello 16, stato 1, riga 3
Il nome di colonna 'codice anagrafico' non è valido

il mio problema è che codice anagrafico esiste ed è la chiave primaria della tabella..
ho pensato di aver costruito male la query..e quindi ho provato una piu semplice
SELECT S.[codice anagrafico] FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source = C:\=MIKI_ORI\DB_Base.mdb; User Id=admin;Password=;')...[ANAGRAFICA] AS S

ma mi ritorna lo stesso errore..
cosa posso fare?il bello è che le query di primo inserimento come

select * from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source = C:\=MIKI_ORI\DB_Base.mdb; User Id=admin;Password=;')...ANAGRAFICA

mi funzionano perfettamente..dove sto sbagliando?

lbenaglia Profilo | Guru

>ON T.[codice anagrafico] != S-[codice anagrafico]
S-[codice anagrafico]?! Modificala in S.[codice anagrafico]

>ho pensato di aver costruito male la query..e quindi ho provato
>una piu semplice
>SELECT S.[codice anagrafico] FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
>'Data Source = C:\=MIKI_ORI\DB_Base.mdb; User Id=admin;Password=;')...[ANAGRAFICA]
>AS S
Questa sembra sintatticamente corretta.

>ma mi ritorna lo stesso errore..
>cosa posso fare?
Non ne ho idea.

>il bello è che le query di primo inserimento come
>
>select * from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data
>Source = C:\=MIKI_ORI\DB_Base.mdb; User Id=admin;Password=;')...ANAGRAFICA
>
>mi funzionano perfettamente..dove sto sbagliando?
Boh.

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

toyo86 Profilo | Junior Member

il primo è un errore di trascrizione..ho usato s.[codice anagrafico]
non riesco proprio a spiegarmelo..per caso i join hanno limitazioni?

non riesco inoltre a capire come funzionano gli exist..sto leggendoil bol..ma boh..

lbenaglia Profilo | Guru

>il primo è un errore di trascrizione..ho usato s.[codice anagrafico]
>non riesco proprio a spiegarmelo..per caso i join hanno limitazioni?
No, e comunque la prima query che hai scritto è logicamente errata.

>non riesco inoltre a capire come funzionano gli exist..sto leggendoil
>bol..ma boh..
Studia, studia...

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

toyo86 Profilo | Junior Member

in che senso logicamente errata??
non capisco come farmi ritornare i dati che hanno stesso id e data di aggiornamento diversa..e poi come farmi ritornare i dati che non ci sono nella tabella sql server ma ci sono in quella access..
i left outer join mi ritornano le righe della tabella di access anche se non ci sono nel server sql..o sbaglio?

lbenaglia Profilo | Guru

>in che senso logicamente errata??
Nel senso che ti tira fuori risultati errati

>non capisco come farmi ritornare i dati che hanno stesso id e
>data di aggiornamento diversa..
>e poi come farmi ritornare i dati
>che non ci sono nella tabella sql server ma ci sono in quella
>access..

Supponiamo di avere nel file db1.mdb la tabella Students così strutturata:

Field Name Data Type ----------- ---------------------- StudentID Number (Long Integer) FirstName Text (10) LastName Text (10) LastModify Date/Time

e con le seguenti righe:

StudentID FirstName LastName LastModify ----------- ---------- ---------- ----------- 1 Lorenzo Benaglia 01/01/2008 2 Luca Bianchi 02/01/2008 3 Andrea Montanari 03/01/2008

Ora spostiamoci su SQL Server, definiamo una tabella analoga ed allineiamola con i dati presenti in Access:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, LastModify datetime NOT NULL ); /* Inserirsco in SQL Server gli studenti presenti in Access */ WITH CTE_Access AS ( SELECT * FROM OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0' , 'Data Source=D:\Documenti\db1.mdb;User Id=admin;Password=;' )...Students ) INSERT dbo.Students SELECT A.* FROM CTE_Access AS A LEFT JOIN dbo.Students AS S ON A.StudentID = S.StudentID WHERE S.StudentID IS NULL; SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName LastModify ----------- ---------- ---------- ----------------------- 1 Lorenzo Benaglia 2008-01-01 00:00:00.000 2 Luca Bianchi 2008-01-02 00:00:00.000 3 Andrea Montanari 2008-01-03 00:00:00.000 (3 row(s) affected) */ /* Aggiorno lo StudentID 3 in Access */ UPDATE OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0' , 'Data Source=D:\Documenti\db1.mdb;User Id=admin;Password=;' )...Students SET FirstName = 'Gianluca' , LastName = 'Hotz' , LastModify = CURRENT_TIMESTAMP WHERE StudentID = 3; /* Aggiorno in SQL Server gli studenti modificati in Access */ WITH CTE_Access AS ( SELECT * FROM OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0' , 'Data Source=D:\Documenti\db1.mdb;User Id=admin;Password=;' )...Students ) UPDATE dbo.Students SET FirstName = A.FirstName , LastName = A.LastName , LastModify = A.LastModify FROM CTE_Access AS A JOIN dbo.Students AS S ON A.StudentID = S.StudentID WHERE S.LastModify <> A.LastModify; SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName LastModify ----------- ---------- ---------- ----------------------- 1 Lorenzo Benaglia 2008-01-01 00:00:00.000 2 Luca Bianchi 2008-01-02 00:00:00.000 3 Gianluca Hotz 2008-07-24 11:11:48.000 (3 row(s) affected) */ DROP TABLE dbo.Students;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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