En passant dynamique des paramètres d'une procédure stockée dans SQL Server 2008
J'ai cette procédure qui exécute une autre procédure adoptée par un paramètre et de ses paramètres datefrom
et dateto
.
CREATE procedure [dbo].[execute_proc]
@procs varchar(200),
@pdatefrom date,
@pdateto date
as
exec @procs @datefrom=@pdatefrom,@dateto=@pdateto
Mais j'ai besoin aussi de passer les paramètres dynamiquement sans avoir besoin de les modifier dans la procédure. Par exemple, ce que je m'imagine est quelque chose comme cela
CREATE procedure [dbo].[execute_proc]
@procs varchar(200),
@params varchar(max)
as
exec @procs @params
où @params
est une chaîne de caractères comme @param1=1,@param2='somethingelse'
Est-il un moyen de faire cela?
- visitez ce lien: sqlteam.com/article/...
- Qu'est-ce exactement que vous souhaitez atteindre? Si vous ne savez pas quels sont les paramètres qui seront passés à la procédure, comment pouvez-vous les utiliser dans le code de la procédure?
- hmm je ne pense pas que cela répond à ma question 🙁
- Oui je ne sais pas quels sont les paramètres qui seront passés à la procédure stockée à chaque fois, Donc, il va générer l'exécution à chaque fois
- Que voulez-vous dire "générer de l'exécution à chaque fois"? Si les paramètres peuvent être n'importe quoi, et si vous ne savez pas à l'avance ce qu'ils sont, alors comment pouvez-vous écrire n'importe quel code utiliser?
- Bien que le code s'appuie sur la procédure qui est exécuté à chaque fois. Le Seul rôle de cette procédure est d'exécuter une autre procédure en passant des paramètres sans connaître le nombre de paramètres qu'ils sont ou de ce type de données.
- NB: C'est une mauvaise idée à partir d'un point de vue sécurité - vous êtes essentiellement en fournissant un proxy pour exécuter quoi que ce soit sur le serveur SQL.
- Je comprends la question de la sécurité, Donc il n'y a pas d'autre moyen, j'ai pensé que, parce que je peux passer à la procédure stockée de manière dynamique et exécutée à l'intérieur d'une autre procédure dans sql server, ils ont aussi développé une variable dire @params comme paramtype ont été, je peux passer mes variables wraped en un seul. Encore l'idée de passer une variable spéciale disent tableau de valeurs et types, ce serait bien. De toute façon à l'ancienne est le seul moyen.
Vous devez vous connecter pour publier un commentaire.
C'est pas vraiment clair ce que la pointe de votre procédure de wrapper est (audit? débogage?), et il semble très à l'aise solution. Si vous expliquez pourquoi vous voulez le faire, quelqu'un peut avoir un complètement différent et nous espérons que la meilleure solution.
La plus grande question avec votre proposition, c'est que vous ne pouvez passer des paramètres comme des chaînes de caractères et cela signifie que vous avez à gérer tous les de fuir, de conversion de données/mise en forme et de l'injection SQL questions qui viennent avec SQL dynamique. Il serait beaucoup mieux d'appeler chaque procédure directement, en passant correctement tapé des paramètres de votre code d'appel.
Après avoir dit tout cela, si vous voulez vraiment le faire, alors vous pouvez faire quelque chose comme ceci:
Vous devriez aussi jeter un oeil à sp_executesql, qui n'est presque exactement ce que vous voulez, mais il a besoin de tous les types de données des paramètres de trop, dont vous dites qu'il n'est pas possible dans votre scénario.
Dans le code créer une fonction qui renvoie une chaîne de caractères
fonction PassStoredProcedureName(spName as string) as string
retour spName
fin de la fonction
Ensemble de votre jeu de données à des "procédures Stockées"
Lorsque vous avez choisi un client, le spName sera attribuée au paramètre. Lorsque le jeu de données s'exécute, il va passer le paramètre à la fonction, qui passera la spName pour le jeu de données.
Je l'utilise pour exécuter des procédures stockées personnalisées pour les clients lors de la même procédure stockée ne fonctionnera pas pour tous les clients.
Assurez-vous de normaliser un alias de noms de champs, de sorte que la récupération de données à un rapport de ne pas les casser.
Vos procédures stockées doivent toujours avoir le même paramètre exigences, même si elles ne sont pas nécessaires.