SQL Server e query su più db

martedì 28 febbraio 2006 - 10.00

volperubbia Profilo | Senior Member

Ciao a tutti,
su un unico server ho un sistema distribuito su tre basi dati:
- db configurazioni
- db anagrafiche
- db dati operazionali.

Ho la necessità di realizzare stored procedures di reportistica che usino sia il db delle anagrafiche che quello dei dati operazionali. Il problema è il seguente. Nel db di cofigurazioni, per ogni utente, ho in forma tabellare il nome del db dei dati operazionali, come posso gestire questa dinamicità?

...

SELECT * FROM PIPPO.DBO.TABELLA

Il nome PIPPO è dinamico, varia a seconsa dell'utente ...

Una soluzione può essere una EXEC ( ' ' ) , ... non è però molto esaltante.

Qualche idea?

Davide

lbenaglia Profilo | Guru

>su un unico server ho un sistema distribuito su tre basi dati:
>- db configurazioni
>- db anagrafiche
>- db dati operazionali.

Ciao Davide,

non hai specificato il DBMS che stai utilizzando quindi i miei ragionamenti si baseranno su SQL Server.

>Ho la necessità di realizzare stored procedures di reportistica
>che usino sia il db delle anagrafiche che quello dei dati operazionali.

In SQL Server (precedente alla 2005) per referenziare un oggetto di un database differente da quello corrente è sufficiente utilizzare il three-part name, ovvero specificare database.owner.oggetto; SQL Server 2005 finalmente separa il concetto di owner dal concetto di schema, quindi dovrai referenziare l'oggetto utilizzando la forma database.schema.oggetto.

>Il problema è il seguente. Nel db di cofigurazioni, per ogni
>utente, ho in forma tabellare il nome del db dei dati operazionali,
>come posso gestire questa dinamicità?

Eh?!

>...
>
>SELECT * FROM PIPPO.DBO.TABELLA
>
>Il nome PIPPO è dinamico, varia a seconsa dell'utente ...

Gulp?!
Ti confesso che non ho capito niente
Pippo utilizzato in quel modo identifica il nome del database... ora, non venirmi a dire che hai creato un db per ogni login...

>Qualche idea?

Certo, posta uno script SQL che generi tutti i db, le login, gli user accounts, gli oggetti dei tuoi database ed alcune righe di prova, specificando qual è il risultato che vuoi ottenere.

Ciao!

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

volperubbia Profilo | Senior Member

Grazie per l'attenzione,
hai ragione, mi sono espresso male ...

Comunque, ...

> In SQL Server (precedente alla 2005) per referenziare un oggetto di un database differente da quello corrente è sufficiente
> utilizzare il three-part name, ovvero specificare database.owner.oggetto; SQL Server 2005 finalmente separa il concetto di owner
> dal concetto di schema, quindi dovrai referenziare l'oggetto utilizzando la forma database.schema.oggetto.

Sto usando SQL Server 2000, il problema è referenziare l'oggetto nella forma ...

database.owner.oggetto

perchè "database" è noto solo al momento in cui viene eseguita la query, può essere:
database_1.owner.oggetto
database_2.owner.oggetto
............................................

Per l'oggetto non c'è problema, perchè gli n db hanno la stessa struttura, ma non ho ancora trovato il modo più opportuno per parametrizzare il nome del db ... Forse l'unica sarà fare tutto quando mi creo lo script dei vari databases.

Dimenticavo ...

> ... ora, non venirmi a dire che hai creato un db per ogni login ...

... non ho creato un db per ogni login, ... diciamo che un determinato insieme di entità (nel mio caso punti vendita) condivide uno specifico db operazionale.

Davide

lbenaglia Profilo | Guru

>Per l'oggetto non c'è problema, perchè gli n db hanno la stessa
>struttura, ma non ho ancora trovato il modo più opportuno per
>parametrizzare il nome del db ...

Ciao Davide,

non è possibile parametrizzare il nome del database, a meno di ricorrere al dynamic SQL, e quindi al classico EXEC/sp_executesql che avevi accennato all'inizio...

Ciao!

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

mikele Profilo | Newbie

Salve,
ho un problema molto simile in SQL SERVER 2000:
in sostanza ho necessità di parametrizzare il nome della tabella in una stored procedure ma mi viene restituito l'errore "dichiarare @nomevariabile"

ho provato ad usare sp_executesql, secondo l'esempio seguente:

Declare @ExecStr nvarchar (4000)
Declare @NomeTabella nvarchar (100)
Declare @params NVARCHAR(500)

Set @NomeTabella = N'nometabella'

Set @ExecStr = N'SELECT id FROM @tabella'

Set @params = N'@tabella nvarchar (100)'

EXECUTE sp_executesql
@ExecStr,
@params,
@tabella = @NomeTabella

ma il problema rimane il medesimo.

ma perchè in SQL SERVER 2000 non è possibile parametrizzare qualcosa dopo il FROM?

grazie per l'attenzione
ciao!

lbenaglia Profilo | Guru

>ma perchè in SQL SERVER 2000 non è possibile parametrizzare qualcosa
>dopo il FROM?

Ciao mikele,

semplice, perché la clausola FROM non è parametrizzabile.
La sp_executesql ti permette di parametrizzare SOLO i criteri di ricerca specificati nella clausola WHERE in modo da riutilizzare il piano di esecuzione.
Eventualmente puoi utilizzarla per concatenare il nome della tabella al comando di SELECT esattamente come faresti con il comando EXECUTE.

I Books Online sono estremamente chiari in merito:

"sp_executesql (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms188001.aspx

Ad ogni modo questa soluzione è sconsigliabile perchè incorri in tutta una serie di problemi magistralmente descritti nell'articolo del SQL Server MVP Erland Sommarskog:

"The curse and blessings of dynamic SQL"
http://www.sommarskog.se/dynamic_sql.html

>grazie per l'attenzione
Prego.

Ciao!

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

mikele Profilo | Newbie

Grazie per la pronta risposta!
Saluti!
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5