SQL Server Profiler (SQL Server 2012'deyim) kullanarak, sadece değişken adları ile SQL değil, parametre değerlerini gösteren kullanışlı bir izleme oluşturmaya çalışıyorum. Saklı yordam bazı son derece değerli sonuçlar üretmek için Brüt envanter verileri üzerinden yürür ve ben mevcut davranışı belgelemek için çalışıyorum, böylece birim test, tam olarak tanımlamak ve sonra aklı başında bir şey içine yeniden refactor.
Saklı yordam bir imleç oluşturduktan sonra bir while döngüsü yapar bir döngü içinde, 54-parametre alt yordamı yürütmek saklı bir yordam var. İşte basitleştirilmiş bir görünüm:
CREATE PROCEDURE
[dbo].[OuterProcedure]
( @ProductCode varchar(8),
-- 41 more parameters omitted
)
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
-- OMIT ABOUT 10 temporary table declarations.
DECLARE aCursor CURSOR FAST_FORWARD FOR
SELECT [ID],bkno, -- about 40 fields omitted.
FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins
WHERE (about_80_boolean_expressions AND omitted_here)
ORDER BY some,keys,like,this
OPEN aCursor
FETCH NEXT FROM aCursor /* Get First Record */
INTO @ID, @about_40_fields,....
WHILE (@@FETCH_STATUS = 0) AND
( @About80MoreBooleanExpressionsHere)
BEGIN /* 1 */
-- about 700 lines of logic, math and if-parameter-this-then-that
-- stuff omitted
EXEC @ConsiderItem =
InnerProcedureCallWithinLoop
@from_locn,
@About53PARAMSOMITTED,
...
FETCH NEXT FROM CurInventory /* Get Next Record */
INTO @ID,@MoreStuff,...
END
CLOSE CurInventory
DEALLOCATE CurInventory
Bana iletilen tüm parametre değerlerini gösteren bir izlemeyi nasıl alabilirim
InnerProcedureCallWithinLoop
? 54 parametre vardır. Temelde benim SQL "54 hata ayıklama-printfs satırları" yazmak zorunda mı yoksa bir SQL izleme yaparken nasıl bir prosedür çağrısının tüm parametre değerlerini dökümü nasıl?
Şu anda bir iz aldığımda, bu çıktıyı alıyorum:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Bilmek istediğim şey bu @from_locn = 1
ve bu gibi şeyler @About53ParmsOmitted = 'hello world'
.
Bu bana parametrenin gerçek değerini söylemiyor @from_locn
. Bu ilk parametre durumunda, en üst düzey saklı yordamım geçirilir, bu nedenle 0 veya 1 olduğunu biliyorum. Bununla birlikte, bu iç prosedürdeki 43 parametrenin yaklaşık 40'ı FETCH NEXT FROM aCursor
bir WHILE
döngü içindeki operasyondan gelir .
Şu anda izleme bana kaç kez InnerProcedureCallWithinLoop
çağrıldığını ve her birinin ne kadar sürdüğünü söylüyor , ancak o çağrıya ait parametrelerin değerlerinin ne olduğunu değil. Bir şekilde kodumda bulduğum bazı köşe durumunu çoğaltan "çalıştırılabilir bağımsız SQL komut dosyaları" alabilirsem, bu komut dosyalarının izini sürerken, bu kaba işlevleri kurarken (biliyorum, 54 parametre, bu gerçekten brüt, ama yazmadım) Onları!) bana sadece bu köşe-case kendimi, SQL Server saklı yordamlar bu büyük devasa hırıltı dışında çağırmak sağlayan bir SQL komut dosyası oluşturmak için yazarak bir saat sürebilir.
Bu, bir SQL ifadesine inme ve bu karmaşık saklı yordamları inceleyebilecek komut dosyaları oluşturma çabasının bir parçasıdır.
Güncelleme Bir RPC "Output Param" kayıt seçeneği buldum, ancak bir "RPC IN PARAM" kayıt seçeneği bulamadım.