arrière-plan: strong> Si j'avais le programme suivant P> lorsque l'exécution de la requête suivante est exécutée (selon SQL Server Profiler) p> ma question: strong> p> Qu'est-ce que j'essaie de faire est si j'avais le suivant P > Il est dans ma capacité à écrire un analyseur qui va Grâce à chaque paramètre dans la collection CODE> Paramètres CODE> et accumulez la chaîne. Cependant, avant de commencer à écrire cet analgésière à partir de zéro, y a-t-il une classe ou une fonction de classe ou une fonction qui effectue déjà cette action que je suis surveille? P> Si j'avais accès au Metatype du paramètre écrivant l'analyseur serait extrêmement facile, mais je ne fais pas 't Se sentir confronté en utilisant la réflexion dans une application de production pour accéder aux API internes non publiées de la framework .NET. p> p>
générerequery code> retournerait la chaîne p>
3 Réponses :
Actuellement, il n'y a rien ici. L'objet de commande envoie le texte paramétré et tous les paramètres sur SQL Server, qui les épouse ensuite à l'aide de la procédure stockée SP_EXECUTESQL. Il n'y a rien dans les objets SQL Server .NET qui analyse la requête avec les paramètres. Vous ne pouvez donc pas tirer ce qui est exécuté sur SQL Server. P>
Même dans SQL Server, vous avez des commandes telles que SP_PREPARE, qui préparera la requête SQL, mais elle ne renvoie pas le texte. Au lieu de cela, il renvoie une poignée à la requête compilée, avec des paramètres. J'imagine, avec un peu d'enquête, vous pouvez trouver où se trouve la requête compilée, mais il ne serait pas efficace d'utiliser SQL Server pour effectuer ce type de travail pour vous. Et ce n'est que si vous pouvez récupérer la requête compilée et revenir à la déclaration. p>
Dans les anciennes versions de SQL Server, vous pouvez utiliser le sp_helptext pour tirer le texte de System Sprates, mais cela ne fonctionne plus. Cela pourrait vous montrer comment ils le font, mais ce ne serait pas mieux que de construire votre propre analyseur. P>
Une tentative de création d'une chaîne de SQL et de paramètres faciliterait la méthode initiale de la bonne requête. P>
sp_executesql crée une requête paramétrée sur SQL Server et réutiliser le plan de requête si un appel répété a la même chaîne SQL et la même signature (mais éventuellement différentes valeurs de paramètre). La sortie du profileur SQL avec sp_executesql est en fait envoyée comme celle-ci; Il peut être copié et exécuté dans SSMS. La concaténation des valeurs de paramètre dans une chaîne SQL créerait un nouveau plan de requête et de requête pour chaque appel, comme s'il avait été concaténé au début (y compris la pénalité de performance et le risque d'injection SQL). P>
sp_prepare et dbcommand.prepare () dans Ado.net, sont obsolètes à mon avis, car l'application doit conserver une poignée à la requête et peut l'utiliser uniquement dans la portée limitée (connexion), tandis que SP_Executeql réutilise Plans de requête Chaque fois que SQL et Signature Strings (paramètres et types) sont égaux, peu importe la manière dont la demande les obtient. P>
Vous faites la même erreur Méthodman fait dans les commentaires . Je ne tente pas de "dépariner" la requête. Ma question était là qu'il existe un moyen facile d'établir l'appel sp_executeql code> qui aurait été généré par code .NET. Spécifiquement s'il y avait un moyen facile de générer les types qui devraient être passés dans le paramètre code> @params code> sans codage de la main chacun des types de données SQL possibles.
Fondamentalement, y a-t-il un moyen, sans réflexion, pour obtenir la valeur de MetaType.getMeTaTypefromsqldbtype (dbtype, ismultivalued) .Typename code>
La réponse de Gregory est un peu correcte, mais surtout incorrecte. VRAI, il n'y a pas de méthode de code code> code> que vous pouvez appeler pour obtenir ceci, mais il y a S'il s'agit d'un code source Microsoft, le code fait également partie du projet Open Source .NET CORE, qui est principalement publié sous le licence MIT . Signification, vous pouvez copier et coller les pièces dont vous avez besoin :-). Et même si le code n'était que sur référencesSource.microsoft.com, vous seriez toujours en mesure d'apprendre ce dont vous en avez besoin et de l'utiliser pour vérifier que votre version est fonctionnellement conforme à celle-ci. P>
On dirait que la principale chose dont vous avez besoin est la méthode code> BuildParamList Code> (et, bien sûr, quel que soit l'appels d'appels): P>
privé code> un (que vous ne pouvez pas appeler) qui reconquit effectivement le
CommandText code> et
sqlparametercollection code> en tant qu'appel de procédure stocké sur
sp_executesql code> avec la liste pré-formatée des noms de paramètres et de types de données comme deuxième paramètre d'entrée sur cette procédure stockée (voir la Remarque sur
BuildParamlist code> ci-dessous). P>
Ohh, je n'ai pas pensé à revoir cela une fois .Net Core a été publié.
@Scottchamberlain Je viens de mettre à jour ma réponse pour clarifier un peu les choses. Mais même sans le projet sur GitHub, vous pourriez toujours obtenir les informations nécessaires pour vous sentir confiant que votre code se comportait comme il se doit :).
Donc, vous voulez obtenir la chaîne qui passe à partir de l'objet
SQLCOMMAND code>? Il semble que ce soit assez facile pour faire un
string.format () code> pour obtenir la chaîne SQL brute ...
@Dleh je suis d'accord, c'est pourquoi j'ai dit que je pouvais le faire moi-même. La seule partie qui pourrait être délicate est la traduction
paramètre.dbtype code>,
paramètre.Size code> et
paramètre.scale code> correctement. C'est pourquoi je voulais savoir si .net avait un endroit pour faire cela pour moi pour que je n'aurais donc pas besoin de faire le travail d'écrire cette transformation.
Essayez ce lien sauf si vous parlez de la même chose qui est capturé dans les serveurs SQL Profiler - Stackoverflow.com/questions/265192/...
@Methodman no, je veux réellement les paramètres. Ce que cela sera utilisé pour est un ensemble de requêtes sont stockés dans un DB puis exécuté plus tard. Actuellement, toutes les requêtes sont non paramétrées (utilisant une technique similaire à la réponse dans votre lien). Mon objectif est de pouvoir exécuter les requêtes sous forme paramétrée pour aider à utiliser des éléments comme le cache de plan dans SQL.