Comment puis-je exécuter sql texte passé en paramètre sp?
J'ai une procédure stockée avec un paramètre de type nvarchar. J'attends les appelants de fournir le texte de la commande sql lors de l'utilisation de cette SP.
Comment puis-je exécuter le sql fournies par commande à partir de l'intérieur de la SP?
Est-ce même possible?-
J'ai pensé qu'il était possible d'utiliser EXEC mais les suivantes:
EXEC @script
de messages d'erreur indiquant qu'il ne peut pas trouver une procédure stockée par le nom donné. Comme c'est un script c'est évidemment exact, mais m'amène à penser qu'il ne fonctionne pas comme prévu.
- Je suis d'accord avec toute la sécurité des commentaires, mais vous pouvez essayer [ EXEC (@script) ] qui devrait fonctionner.
- Bien que valables,
EXEC
ne cache le plan de requête alors queEXEC sp_executesql
sera: sommarskog.se/dynamic_sql.html - Vrai, mais si les utilisateurs vont l'approvisionnement de texte pour SQL (ce qui me fait peur, mais), je m'attends à la requête des plans de varier. Maintenant, si l'on ne peut convaincre les gens de ne PAS laisser les utilisateurs faire de cette...
- [ EXEC (@script) ] fonctionne aussi bien. Merci De Sparky.
Vous devez vous connecter pour publier un commentaire.
Utilisation:
...en supposant que le paramètre est un ensemble de requêtes SQL. Si non:
Être conscient de Les attaques par Injection SQL, et je recommande fortement la lecture de La malédiction et la bénédiction de SQL Dynamique.
vous pouvez simplement exec @sqlStatement à partir de votre sp. Cependant, ce n'est pas la meilleure chose à faire, car il vous ouvre à une injection sql. Vous pouvez voir un exemple ici
EXEC
ne cache le plan de requête alors queEXEC sp_executesql
sera: sommarskog.se/dynamic_sql.htmlVous utilisez
EXECUTE
passant une commande en tant que chaîne de caractères. Remarque cela pourrait laisser la porte ouverte à de graves vulnérabilités étant donné qu'il est difficile de vérifier la non-malveillance des instructions SQL vous êtes à l'aveuglette en cours d'exécution.Très soigneusement. Ce code pourrait faire quoi que ce soit, y compris d'ajouter ou de supprimer des enregistrements, ou même des tables ou bases de données.
Pour être sûr de cela, vous devez créer un compte utilisateur séparé qui n'a dbreader autorisations sur un petit ensemble de tables/vues et l'utilisation de la EXÉCUTER EN TANT QUE commande pour limiter le contexte de l'utilisateur.