Débogage des requêtes dans les procédures stockées

Considérez cette procédure stockée. Le contenu réel de la procédure n'a pas d'importance, je l'utilise uniquement pour l'exemple:

CREATE PROCEDURE [dbo].[temp] @value1 varchar(50), @value2 varchar(50), @value3 varchar(50) as begin Select * From valuesTable (nolock) inner join valuesTable2 RL (nolock) on (ValuesTable.ID = RL.RuleId and RL.Type = 'Something') where @value1 = ValuesTable.RuleVal02 and cast(@value2 as float) > cast(ValuesTable.RuleVal03 as float) and cast(@value2 as float) < cast(ValuesTable.RuleVal04 as float) --and (@value3 = ValuesTable.RuleVal05) and (@value3 = ValuesTable.RuleVal05 or ValuesTable.RuleVal05 = -1) end 

Maintenant, imaginez que cette fonction (pas très complexe) ne fonctionne pas. Je sais déjà comment le déboguer à partir de Visual Studio et de SQL Server Management Studio, mais les deux cas manquent:

Le principal sharepoint défaillance de cette fonction est la grande requête qu'il exécute. Ce que je voudrais faire alors, c'est de prendre cette requête, de la copyr dans une nouvelle window de requête et de commencer à l'exécuter et à la déboguer en modifiant ses différentes parties.

La méthode de base pour déboguer cette requête serait de la copyr dans une nouvelle window de requête, d'get les parameters du code d'exécution, puis de replace manuellement toutes les @variables par leur valeur réelle. Cela fonctionne, mais cela me semble un travail très inutile et idéalement je voudrais get la requête, car elle est exécutée sur le server – Avec des valeurs littérales au lieu des parameters, par exemple:

 where 'actualValue' = ValuesTable.RuleVal02 and cast(4.2 as float) > cast(ValuesTable.RuleVal03 as float) and cast(4.2 as float) < cast(ValuesTable.RuleVal04 as float)... 

Comme cela ressemblait à quelque chose que je ne peux get qu'à partir d'un profiler, je l'ai lancé. Puis j'ai configuré les events pour capturer l'événement SP:StmtStarting , pour voir les instructions exécutées à partir de procédures stockées. À ma grande surprise, cependant, les déclarations que je vois dans le profiler, montrent encore avec leur paramètre et non la valeur littérale réelle.

Est un moyen que je pourrais facilement copyr la requête réelle qui est exécutée dans une procédure stockée avec les parameters remplacés à la valeur littérale du paramètre? Y a-t-il un drapeau dans le profileur pour le faire? Ou y a-t-il un autre moyen?

vous pouvez écrire votre requête dans une variable, avec des espaces réservés au lieu des valeurs réelles, replace les espaces réservés lors de l'exécution et l'exécuter avec sp_executesql

évidemment c'est juste une chose que vous devriez faire à des fins de debugging et non en production;)

voici un exemple: http://sqlfiddle.com/#!3/c8c43/5

là vous avez votre requête remplie de contenu réel, à l'intérieur de la variable

Essayez ce stream de travail simple (nécessite 5 secondes):

  1. Exécutez SSMS.
  2. Trouvez votre procédure stockée dans la window de l'Explorateur d'objects.
  3. Faites un clic droit dessus pour afficher le menu contextuel et select «Exécuter la procédure stockée …».
  4. Définissez TOUS les parameters dans le formulaire affiché.
  5. SSMS génère le script pour vous dans le nouvel onglet de requête (voir le script à la fin de cette réponse).
  6. Enregistrez ce script pour une utilisation ultérieure.
  7. Exécuter le debugging -> Démarrer le debugging de ce script, puis passer à l'instruction EXEC.
  8. Modifiez les valeurs des parameters et exécutez le debugging suivant.
 DECLARE @return_value int EXEC @return_value = [dbo].[temp] @value1 = N'1', @value2 = N'2', @value3 = N'3' SELECT 'Return Value' = @return_value GO