Discussione:
eseguire una query su tabelle contenute in DB sql diversi
(troppo vecchio per rispondere)
Info_pat_dgm
2005-12-17 01:47:54 UTC
Permalink
Ciao a tutti
Sono impelagato in un problema con sql 2000 chi mi può dare una mano?

Il problema è questo:

ho 2 db e vorrei ottenere con una query la visualizzazione i record
,leggendo i dati da tabelle diverse contenute nei due database,. Il
risultato deve essere visualizzato in una datagrid contenuta in una pagina
aspx.
Es.

T1 , T2 T3 contenute in DB_A

TX contenuta in DB_Y

Il risultato che vorrei ottenere dovrebbe essere una query che contenga i
campi che mi interessano delle tabelle TX,T1,T2,T3.

Grazie
Patrizio
Lorenzo Benaglia
2005-12-17 11:01:44 UTC
Permalink
Post by Info_pat_dgm
Es.
T1 , T2 T3 contenute in DB_A
TX contenuta in DB_Y
Il risultato che vorrei ottenere dovrebbe essere una query che
contenga i campi che mi interessano delle tabelle TX,T1,T2,T3.
Ciao Patrizio,

se i database risiedono sulla stessa istanza SQL Server, puoi connetterti al
DB_A e referenziare la tabella TX del DB_Y utilizzando il three-part name,
ovvero specificando database.owner.tabella (in SQL Server 2000) o
database.schema.tabella (in SQL Server 2005); se i database risiedono su due
istanze differenti (anche su server diversi) devi definire un linked server
all'istanza remota ed utilizzare il four-part name, ovvero specificando
server.database.owner.tabella (in SQL Server 2000) o
server.database.schema.tabella (in SQL Server 2005).
Post by Info_pat_dgm
Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Info_pat_dgm
2005-12-19 12:46:02 UTC
Permalink
Post by Lorenzo Benaglia
Post by Info_pat_dgm
Es.
T1 , T2 T3 contenute in DB_A
TX contenuta in DB_Y
Il risultato che vorrei ottenere dovrebbe essere una query che
contenga i campi che mi interessano delle tabelle TX,T1,T2,T3.
Ciao Patrizio,
se i database risiedono sulla stessa istanza SQL Server, puoi connetterti al
DB_A e referenziare la tabella TX del DB_Y utilizzando il three-part name,
ovvero specificando database.owner.tabella (in SQL Server 2000) o
database.schema.tabella (in SQL Server 2005); se i database risiedono su due
istanze differenti (anche su server diversi) devi definire un linked server
all'istanza remota ed utilizzare il four-part name, ovvero specificando
server.database.owner.tabella (in SQL Server 2000) o
server.database.schema.tabella (in SQL Server 2005).
Post by Info_pat_dgm
Grazie
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
ti ringrazio per il suggerimento io quello che stavo cercando di usare è
l'istruzione
*********************************************************************************
SELECT Rowset_2.TPE_Conta, Rowset_2.TPE_CodAn,
Rowset_2.TPE_DataSegnalazione, Rowset_2.TPE_CodSegnaEff,
datiussm.dbo.T_voci.T_Descrizione AS Descrizione,
Rowset_2.TPE_SedeAuGiudiziaria,
datiussm.dbo.T_sedi.T_sede, Rowset_2.TPE_Anno AS TPE_CodDivdaAG,
Rowset_2.TPE_NumRegReato,
Decod.T_Descrizione AS Descaluff
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=WebA;Password=a' ).datiussm.dbo.T_Penale_Te Rowset_2 LEFT OUTER JOIN
datiussm.dbo.T_voci Decod ON Rowset_2.TPE_CodDivdaAG =
Decod.ID LEFT OUTER JOIN
datiussm.dbo.T_sedi ON Rowset_2.TPE_SedeAuGiudiziaria
= datiussm.dbo.T_sedi.ID LEFT OUTER JOIN
datiussm.dbo.T_voci ON Rowset_2.TPE_CodSegnaEff =
datiussm.dbo.T_voci.ID
WHERE EXISTS
(
SELECT TLM_ID_MovimentiComunita,TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE (TLM_ID_MovimentiComunita = 34)
)
ORDER BY Rowset_2.TPE_DataSegnalazione
*******************************************************************************

E credo sia quello che tu mi suggerisci.
Il problema è che a me dovrebbe funzionare con la clausola IN e non EXISTS e
dovrebbe essere cosi:

SELECT Rowset_2.TPE_Conta, Rowset_2.TPE_CodAn,
Rowset_2.TPE_DataSegnalazione, Rowset_2.TPE_CodSegnaEff,
datiussm.dbo.T_voci.T_Descrizione AS Descrizione,
Rowset_2.TPE_SedeAuGiudiziaria,
datiussm.dbo.T_sedi.T_sede, Rowset_2.TPE_Anno AS TPE_CodDivdaAG,
Rowset_2.TPE_NumRegReato,
Decod.T_Descrizione AS Descaluff
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=WebA;Password=a' ).datiussm.dbo.T_Penale_Te Rowset_2 LEFT OUTER JOIN
datiussm.dbo.T_voci Decod ON Rowset_2.TPE_CodDivdaAG =
Decod.ID LEFT OUTER JOIN
datiussm.dbo.T_sedi ON Rowset_2.TPE_SedeAuGiudiziaria
= datiussm.dbo.T_sedi.ID LEFT OUTER JOIN
datiussm.dbo.T_voci ON Rowset_2.TPE_CodSegnaEff =
datiussm.dbo.T_voci.ID
WHERE (Rowset_2.TPE_Conta IN
(
SELECT TLM_ID_MovimentiComunita,TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE (TLM_ID_MovimentiComunita = 34)
)
ORDER BY Rowset_2.TPE_DataSegnalazione
********************************************************************************
Ma in questo modo nel query analizer mi da l’errore:
Se una subquery non è introdotta da EXISTS, nell'elenco di selezione è
possibile specificare una sola espressione.


A me serve che il risultato della query sia il risultato dei record che
soddisfano la condizione della subquery i quali elaborati dalla query
principale in cui la condizione è Rowset_2.TPE_Conta = TLM_ID_segnazione
visualizzino quello che a me interessa.

Potresti dirmi dove sbaglio?

Ho provato a spostare le tabelle in un unico DB usando la query con la
clausola IN e la subquery funziona. è possibile fare la stessa cosa
mantenendo la stessa istanza SQL e DB diversi?

grazie
Lorenzo Benaglia
2005-12-19 13:13:02 UTC
Permalink
Post by Info_pat_dgm
WHERE (Rowset_2.TPE_Conta IN
(
SELECT TLM_ID_MovimentiComunita,TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE (TLM_ID_MovimentiComunita = 34)
)
Se una subquery non è introdotta da EXISTS, nell'elenco di selezione è
possibile specificare una sola espressione.
Esatto, se utilizzi la clausola IN la select list della tabella derivata
deve contenere una sola colonna (e non 2 come nel tuo esempio).
Post by Info_pat_dgm
A me serve che il risultato della query sia il risultato dei record
che soddisfano la condizione della subquery i quali elaborati dalla
query principale in cui la condizione è Rowset_2.TPE_Conta =
TLM_ID_segnazione visualizzino quello che a me interessa.
Non ho capito niente.
Se la condizione deve essere Rowset_2.TPE_Conta = TLM_ID_segnazione modifica
la condizione di WHERE nel seguente modo:

WHERE Rowset_2.TPE_Conta IN (
SELECT TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE TLM_ID_MovimentiComunita = 34
)
Post by Info_pat_dgm
Ho provato a spostare le tabelle in un unico DB usando la query con la
clausola IN e la subquery funziona.
Ti sbagli, come l'hai scritta non può funzionare.
Post by Info_pat_dgm
è possibile fare la stessa cosa
mantenendo la stessa istanza SQL e DB diversi?
Certo, anche se ti suggerisco di definire un linked server invece che
ricorrere al comando OPENDATASOURCE().
Post by Info_pat_dgm
grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Info_pat_dgm
2005-12-19 15:00:02 UTC
Permalink
Post by Lorenzo Benaglia
Post by Info_pat_dgm
WHERE (Rowset_2.TPE_Conta IN
(
SELECT TLM_ID_MovimentiComunita,TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE (TLM_ID_MovimentiComunita = 34)
)
Se una subquery non è introdotta da EXISTS, nell'elenco di selezione è
possibile specificare una sola espressione.
Esatto, se utilizzi la clausola IN la select list della tabella derivata
deve contenere una sola colonna (e non 2 come nel tuo esempio).
Post by Info_pat_dgm
A me serve che il risultato della query sia il risultato dei record
che soddisfano la condizione della subquery i quali elaborati dalla
query principale in cui la condizione è Rowset_2.TPE_Conta =
TLM_ID_segnazione visualizzino quello che a me interessa.
Non ho capito niente.
Se la condizione deve essere Rowset_2.TPE_Conta = TLM_ID_segnazione modifica
WHERE Rowset_2.TPE_Conta IN (
SELECT TLM_ID_segnazione
FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source=(local);User
ID=Web_B;Password=b' ).daticomunita.dbo.TC_LegameMovSegnalazioni
WHERE TLM_ID_MovimentiComunita = 34
)
Post by Info_pat_dgm
Ho provato a spostare le tabelle in un unico DB usando la query con la
clausola IN e la subquery funziona.
Ti sbagli, come l'hai scritta non può funzionare.
Post by Info_pat_dgm
è possibile fare la stessa cosa
mantenendo la stessa istanza SQL e DB diversi?
Certo, anche se ti suggerisco di definire un linked server invece che
ricorrere al comando OPENDATASOURCE().
Post by Info_pat_dgm
grazie
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
grazie

grazie mi sei stato molto utile il mio errore era prorio quello di aver
dichiarato nella select 2 campi

grazie ancora

Continua a leggere su narkive:
Loading...