J'ai le code suivant:
Using cmd As SqlCommand = Connection.CreateCommand
cmd.CommandText = "UPDATE someTable SET Value = @Value"
cmd.CommandText &= " WHERE Id = @Id"
cmd.Parameters.AddWithValue("@Id", 1234)
cmd.Parameters.AddWithValue("@Value", "myValue")
cmd.ExecuteNonQuery
End Using
Je me demande s'il existe un moyen d'obtenir la déclaration SQL finale sous forme de chaîne, qui devrait ressembler à ceci:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Si quelqu'un se demande pourquoi je ferais cela:
- pour la journalisation des instructions (échouées)
- pour avoir la possibilité de le copier-coller dans l'Enterprise Manager à des fins de test
Réponses:
Bien que pas parfait, voici quelque chose que j'ai créé pour TSQL - qui pourrait être facilement modifié pour d'autres saveurs ... Si rien d'autre, cela vous donnera un point de départ pour vos propres améliorations :)
Cela fait un travail OK sur les types de données et les paramètres de sortie, etc. similaire à l'utilisation de "exécuter la procédure stockée" dans SSMS. Nous avons principalement utilisé des SP, donc la commande "text" ne tient pas compte des paramètres, etc.
cela génère une sortie le long de ces lignes ...
la source
ToBooleanOrDefault
ici: Question # 3244850À des fins de journalisation, j'ai bien peur qu'il n'y ait pas de meilleur moyen de faire cela que de construire la chaîne vous-même:
la source
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
pour remplacer les paramètres dans la chaîne. Cela remplacera le «mot entier». Ce n'est peut-être pas une solution universelle car le \ b marque une position entre un caractère de mot et un caractère non-mot, donc dans le cas où les noms de vos paramètres commencent par @, vous devriez utiliserp.ParameterName + @"\b"
pour remplacer le paramètre dans la chaîne de requête.Vous ne pouvez pas, car il ne génère aucun SQL.
La requête paramétrée (celle dans
CommandText
) est envoyée au serveur SQL comme l'équivalent d'une instruction préparée. Lorsque vous exécutez la commande, les paramètres et le texte de la requête sont traités séparément. A aucun moment, une chaîne SQL complète n'est générée.Vous pouvez utiliser SQL Profiler pour jeter un œil dans les coulisses.
la source
J'avais besoin d'une commande similaire à string transformer pour permettre une journalisation plus détaillée, j'ai donc écrit celle-ci. Il produira le texte nécessaire pour réexécuter la commande dans une nouvelle session, y compris les paramètres de sortie et les paramètres structurés. Il est légèrement testé, mais attention au vide.
Exemple:
Produira:
La mise en oeuvre:
la source
N
préfixe.J'ai également eu ce problème où certaines requêtes paramétrées ou sp me donneraient une SqlException (la plupart du temps la chaîne ou les données binaires seraient tronquées), et les déclarations étaient difficiles à déboguer (pour autant que je sache, il n'y a actuellement pas de support de sql-profiler pour SQL Azure)
Je vois beaucoup de code simulaire dans les réactions ici. J'ai fini par mettre ma solution dans un projet Sql-Library pour une utilisation future.
Le générateur est disponible ici: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Il prend en charge à la fois CommandType.Text et CommandType.StoredProcedure
Et si vous installez le package nuget, vous pouvez le générer avec cette instruction:
la source
Si vous utilisez SQL Server, vous pouvez utiliser SQL Server Profiler (si vous l'avez) pour afficher la chaîne de commande qui est réellement exécutée. Cela serait utile pour les tests de copier / coller, mais pas pour la journalisation, j'en ai peur.
la source
Réponse tardive, je sais mais je voulais aussi cela pour pouvoir enregistrer le SQL. Ce qui suit est court et répond à mes besoins.
Ce qui suit produit du SQL que vous pouvez copier / coller dans SSMS (il remplace correctement les paramètres par les valeurs). Vous pouvez ajouter plus de types, mais cela répond à tout ce que j'utilise dans ce cas.
Maintenant, je peux enregistrer le SQL juste avant de l'exécuter:
la source
Profiler est sans conteste votre meilleure option.
Vous devrez peut-être copier un ensemble d'instructions à partir du profileur en raison des étapes de préparation + exécution impliquées.
la source
J'ai eu la même question exacte et après avoir lu ces réponses, j'ai décidé par erreur qu'il n'était pas possible d'obtenir la requête résultante exacte. J'avais tort.
Solution: Ouvrir
Activity Monitor
dansSQL Server Management Studio
, rétrécir la section processus au nom d' utilisateur de connexion, base de données ou le nom de l' application que votre application utilise dans la chaîne de connexion. Lorsque l'appel est fait à la db refreshActivity Monitor
. Lorsque vous voyez le processus, faites un clic droit dessus etView Details
.Notez que cela peut ne pas être une option viable pour une base de données occupée. Mais vous devriez pouvoir réduire considérablement le résultat en suivant ces étapes.
la source
Utilisé une partie du code de Flapper pour ma solution, qui retourne toute la chaîne SQL, y compris les valeurs de paramètres à exécuter dans MS SQL SMS.
la source
Ma solution:
la source
J'ai écrit cette méthode pour moi. J'utilise une partie du code de Bruno Ratnieks . Peut-être que c'est utile à quelqu'un.
la source
S'il ne s'agit que de vérifier la mise en forme d'un paramètre dans la requête de résultat, la plupart des SGBD autoriseront l'interrogation de littéraux à partir de rien. Donc:
De cette façon, vous pouvez voir si les citations sont doublées, etc.
la source
Voici ce que j'utilise pour générer des listes de paramètres pour une procédure stockée dans la console de débogage:
Cela générera une sortie de console similaire à ceci:
Je place ce code directement sous toute procédure que je souhaite déboguer et est similaire à une session de profileur SQL mais en C #.
la source
Version modifiée de la réponse de Kon car elle ne fonctionne que partiellement avec des paramètres nommés similaires. L'inconvénient de l'utilisation de la fonction String Replace. À part cela, je lui donne tout le crédit sur la solution.
la source
Cette solution fonctionne pour moi en ce moment. Peut-être que c'est utile pour quelqu'un. Veuillez excuser toute redondance.
la source
Comme @pkExec et @Alok l'ont mentionné, utiliser Remplacer ne fonctionne pas dans 100% des cas. C'est la solution que j'ai utilisée dans notre DAL qui utilise RegExp pour "faire correspondre le mot entier" uniquement et formater correctement les types de données. Ainsi le SQL généré peut être testé directement dans MySQL Workbench (ou SQLSMS, etc ...) :)
(Remplacez la fonction MySQLHelper.EscapeString () en fonction du SGBD utilisé.)
Exemple:
Sera généré:
la source
les requêtes de commande sql seront exécutées avec exec sp_executesql, voici donc une autre façon d'obtenir l'instruction sous forme de chaîne (méthode d'extension SqlCommand):
la source
nécessaire pour couvrir également les procédures non stockées, j'ai donc augmenté la bibliothèque CommandAsSql (voir les commentaires sous la réponse de @ Flapper ci-dessus) avec cette logique:
la demande d'extraction est à l' adresse : https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
l'idée Regex était basée sur les commentaires de @ stambikk et EvZ ci-dessus et de la section "Mise à jour:" de https://stackoverflow.com/a/2544661/903783 qui mentionne une "assertion négative de regard en arrière". L'utilisation de \ B au lieu de \ b pour la détection de limite de mot au début de l'expression régulière est due au fait que p.parameterName commencera toujours par un "@" qui n'est pas un caractère de mot.
notez que ParameterValueForSQL () est une méthode d'extension définie dans la bibliothèque CommandAsSql pour gérer des problèmes tels que les valeurs de paramètres de chaîne à guillemets simples, etc.
la source
Si vous voulez convertir le texte de commande:
Vous pouvez maintenant obtenir le texte de commande sans paramètre comme suit:
et le résultat est "UPDATE someTable SET Value = 'myValue' WHERE Id = 1234" sans paramètre
la source
Code de Kon étendu pour aider à déboguer une procédure stockée:
Dans mon premier cas de test, il a généré:
Vous devrez probablement ajouter d'autres affectations de type "..is ..." conditionnelles, par exemple pour les dates et les heures.
la source
Bon mot:
la source
De la commande de paramètre à la commande sans paramètre, vous pouvez changer celle-ci
À
la source