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):
DECLARE @return_value int EXEC @return_value = [dbo].[temp] @value1 = N'1', @value2 = N'2', @value3 = N'3' SELECT 'Return Value' = @return_value GO