Procedure stockée : database en parametre

Résolu
morm91 Messages postés 7 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 29 juillet 2008 - 27 mai 2008 à 17:58
morm91 Messages postés 7 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 29 juillet 2008 - 28 mai 2008 à 10:07
Bonjour (ou bonsoir) a tous.

Alors je vous expose mon probleme. Je travaille sur un projet réalisé en ASP.NET dans lequel je fais appel à un grand nombre de procédures stockées.
Le probleme est que ces procédures doivent pouvoir être utilisés sur plusieurs base de données (celle de test, et celle en production).
J'aurai donc voulu pouvoir passer le nom de ma base de donnée comme paramêtre de ma procédure stockée, mais celle ci étant déclaré en tant que string, il est impossible de l'utiliser derriere : j'aurai voulu pouvoir faire qqchose du genre " select champ1, champ2 from @DB..table1 " ou @DB est le parametre contenant le nom de ma base de données.

Je ne suis pas du genre a posté un probleme des que je le rencontre, mais au bout de 2 heures de recherches intensives se révélant infructueuse, je me tourne vers vous :)
Je suis donc ouvert a toute proposition me permettant de corriger ou contourner ce probleme, sachant que je suis sensé publier le site demain...

En vous remerciant par avance,
Pierre

3 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 mai 2008 à 22:09
Salut,

Je te donne d'abord ce qui me passe par la tête au niveau SQL, et apres la solution SIMPLE !

Au niveau SQL, il n'y a qu'une seule solution à ton problème,
passer par une requete texte :

declare  @base  varchar(35)
set  @base =  'MA_BASE'



declare @sql  varchar(500)
set  @sql =  'select champ1, champ2 from ' + @base +  '..table1'

execute (@sql)

-- De même , si tu dois utiliser des variables declarées en dehors de la requête texte,
-- c'est possible, il faut simplement la caster en sysname pour pointer vers sa réference et pas sur sa valeur :
-- par exemple affecter une valeur à une variable :

declare @sql  varchar(100)

declare  @ma_var  int
set  @sql  'set ' + cast(@ma_var as  sysname) + ' 10 '

exec(@sql)

select  @ma_var    -- affiche 10

Maintenant la solution SIMPLE, tu passe un entier à tes procédures :
1 = base 1
2 = base 2

Et dans les procédures stockées :
if @base = 1
    select* from base1..table1
else
    select * from base 2..table2
3
morm91 Messages postés 7 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 29 juillet 2008
28 mai 2008 à 09:44
Merci tout d'abord pour la réponse :)

Donc comme je m'en doutais, il va falloir passer par une requete texte. C'est ce que j'avais commencé à faire, mais je ne savais pas que l'on pouvait les cast en sysname, ce qui faisais que je devais mettre toute ma proc dans la même string. Je vais essayer en faisant ca, ca devrait marcher :).
En revanche la solution simple ne pourra pas m'aider, mes procédures sont trop grandes, ca serait une vrai usine à gaz.

En tout cas je te remercie et te tiendrai au courant de l'avancement de mon problême :)
0
morm91 Messages postés 7 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 29 juillet 2008
28 mai 2008 à 10:07
Permier problème :s
En fait j'ai l'impression que quand je fais set  @sql  'set ' + cast(@ma_var as  sysname) + ' 10 ', ma variable @sql  ne contient rien, comme si le cast renvoyait null.

Je ne sais pas si le problème vient de moi (j'utilse SQL Server 2005), ou si je n'ai aps tout compris sur l'utilisation du sysname.
0
Rejoignez-nous