SQL SEVER e MULTIDATABASE.

mercoledì 07 giugno 2006 - 09.27

Bluemax71 Profilo | Newbie

Buongiornoa tutti.
Ho un terrificante problema relativo ad una struttura di dati al quanto particolare.

Ho un DATABASE principale (che chiameremo ALFA) sul quale sono presenti tabelle, viste, stored procedures ecc... che HANNO la necessità di richiamare i dati da tabelle presenti su altri database di volta in volta creati (al cambio dell'anno contabile).

Quindi avremo delle procedure che richiamate su ALFA devono di volta in volta recuperare i dati da NOMI DATABASE DINAMICI.

Faccio esempio.

Su ALFA esiste un comando quale...

Select * from (NomeDatabaseAnnoVoluto)..Articoli.

Il problema è che il <<NomeDatabaseAnnoVoluto>> cambia di volta in volta a seconda delle situazioni di login.

Invece che costruire la select all'interno di una stringa con:

Set @SQL = 'Select * from ' + @NomeDatabaseAnnoVoluto + '..Articoli'
quindi Exec (@SQL)

Ci sono altri modi per fare delle interrogazioni su strutture di dati in modo DINAMICO ?

Qualsiasi suggerimento (a parte quello di avere un unico database dato che, credetemi, è impensabile) è ben accetto.

Grazie.

Brainkiller Profilo | Guru

>Set @SQL = 'Select * from ' + @NomeDatabaseAnnoVoluto + '..Articoli'
>quindi Exec (@SQL)
>Ci sono altri modi per fare delle interrogazioni su strutture
>di dati in modo DINAMICO ?

Io userei questa tecnica, anche se Lorenzo saprà sicuramente consigliarti qualcosa di meglio.

>Qualsiasi suggerimento (a parte quello di avere un unico database
>dato che, credetemi, è impensabile) è ben accetto.

Perchè è impensabile ?
Se da un certo punto di vista potrebbe essere utile spaccare su più database poi sul fronte applicativo ti ritrovi ad affrontare i problemi di cui parli. Già è difficile gestire un database figurati 3 o 4 , ogni anno ce n'è uno nuovo.

Non so che SQL Server usi ma sul SQL 2005 puoi usare il partizionamento delle tabelle. Un maxi tabellone viene suddiviso in più tabelle che contengono rispettivamente i dati di ogni anno. Poi con una Vista puoi unire queste table come se fossero una unica. In questo modo i dati stanno tutti su un DB anche se su 3 tabelle, l'accesso e le query alle tabelle stesse sono più rapide (rispetto a un tabellone) e sul fronte applicativo hai la massima trasparenza grazie alla View. Il database fa il resto.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Bluemax71 Profilo | Newbie

non posso perchè stiamo trasferendo i dati da un applicativo VBA, con tonnellate di codice VBA su una struttura SQL SERVER.

Adesso è impensabile riscrivere tutto il codice VBA dato che abbiamo tempi stretti ed in breve, è necessario solo trasferire i dati su SQL SERVER.

Ma mentre prima il codice VBA eliminava e ricostruiva tabelle collegate ad un database o altro a seconda dell'anno, adesso è necessario avere la stessa struttura.

Ossia un database 'PADRE' ed altri 'FIGLI' che vengono creati ogni anno.

Le stored (funzioni e altro) presenti su PADRE devono di volta in volta andare a leggersi i dati sul database FIGLIO attivato quando si accede al programma selezionando l'anno contabile.

Dato che non esiste (almeno credo) la possibilità di creare tabelle collegate su SQL SERVER ne tanto meno creare e distruggere VISTE di volta in volta a seconda dell'anno selezionato (la vista è estremamente lenta) mi chiedevo come era possibile parametrizzare tutte le stored e funzioni di SQL SERVER.


grazie

lbenaglia Profilo | Guru

>Dato che non esiste (almeno credo) la possibilità di creare tabelle
>collegate su SQL SERVER ne tanto meno creare e distruggere VISTE
>di volta in volta a seconda dell'anno selezionato (la vista è
>estremamente lenta) mi chiedevo come era possibile parametrizzare
>tutte le stored e funzioni di SQL SERVER.

In SQL Server puoi definire dei linked server ad istanze remote oppure utilizzare le funzioni OPENDATABASE o OPENROWSET per interrogare saltuariamente data provider remoti.

L'architettura che avete pensato (e che purtroppo è adottata da molti gestionali) non mi piace per niente, dato che non vedo l'esigenza di definire un nuovo db ogni anno.

SQL Server è in grado di gestire database di TB (vedi ad esempio http://terraservice.net o http://skyserver.sdss.org) ed offre diversi sistemi per partizionare i dati (distributed partitioned views o le nuove partitioned tables di SQL Server 2005).

Per rispondere alla tua domanda il nome del database non è parametrizzabile e l'unica soluzione consiste nel ricorrere al Dynamic SQL, cosa sconsigliatissima come puoi leggere nel seguente articolo di Erland:
http://www.sommarskog.se/dynamic_sql.html

>grazie
Prego.

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