Hoe debug je opgeslagen procedures met afdrukinstructies?

Ik probeer fouten op te sporen in opgeslagen procedures in SQL Server Management Studio 2008. Ik wil enkele afdrukinstructies invoegen om enkele IF-instructies te testen waarvan ik weet dat ze onjuist zijn.

Om foutopsporing uit te voeren, heb ik geprobeerd de opdracht PRINT '5'te gebruiken.

Ik heb geprobeerd de RAISERRORzoals 'RAISERROR (N'Start',10,1) WITH NOWAIT'te gebruiken.

Maar deze vertoonden geen afdrukken, alleen de resultatenset. Het bericht zegt alleen 1 row affected.

Ik heb geprobeerd de code zo te schrijven (misschien is dit een onjuiste benadering):

SET NOCOUNT ON         
RAISERROR (N'Start',10,1) WITH NOWAIT    
DECLARE @DocHandle INT        
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT        
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit   

Wat is de beste manier om afdrukinstructies te gebruiken om fouten op te sporen in een opgeslagen procedure?


Antwoord 1, autoriteit 100%

Als u Microsoft SQL Server Management Studio (SSMS) gebruikt, worden afdrukinstructies afgedrukt op het tabblad Berichten, niet op het tabblad Resultaten.

Afdrukoverzichten verschijnen daar.


Antwoord 2, autoriteit 55%

Hier is een voorbeeld van het gebruik van printstatements. Ze zouden onder het tabblad Berichten moeten verschijnen zoals een vorige persoon heeft aangegeven.

Declare @TestVar int = 5;
print 'this is a test message';
print @TestVar;
print 'test-' + Convert(varchar(50), @TestVar);


Antwoord 3, autoriteit 47%

Voordat ik bij mijn herhaalde antwoord kom; Ik geef toe dat het enige antwoord dat ik hier zou accepteren deze eenvan KM.hierboven. Ik heb de andere antwoorden weggestemd omdat geen van hen de gestelde vraag daadwerkelijk beantwoordde of omdat ze niet adequaat waren. PRINT-uitvoer wordt inderdaad weergegeven in het berichtenvenster, maar dat is helemaal niet gevraagd.

Waarom wordt de uitvoer van de PRINT-instructie niet weergegeven tijdens de uitvoering van mijn opgeslagen procedure?
De korte versie van dit antwoord is dat je de uitvoering van je sproc naar de SQL-server stuurt en het zal niet reageren totdat het klaar is met de hele transactie. Hier is een beter antwoord op deze externe link.

  • Voor nog meer meningen/observaties richt u uw aandacht op dit SO-bericht hier.
  • Kijk vooral naar dit antwoordvan hetzelfde bericht van Phil_factor (Ha ha! Ik hou van de SQL-humor)
  • Wat betreft de suggestie om RAISERROR WITH NOWAIT te gebruiken, bekijk dit antwoordvan hetzelfde bericht van JimCarden

Doe deze dingen niet

  1. Sommige mensen hebben de indruk dat ze gewoon een GO-statement kunnen gebruiken na hun PRINT-statement, maar je kunt het GO-statement NIET INSIDE van een sproc gebruiken. Dus die oplossing is uit.
  2. Ik raad niet aan om je printstatements te SELECTEREN omdat het je resultatenset alleen maar met onzin gaat vertroebelen en als je sproc later door een programma zou moeten worden verbruikt, dan moet je weten welke resultatensets je moet gebruiken overslaan wanneer u door de resultaten van uw gegevenslezer bladert. Dit is gewoon een slecht idee, dus doe het niet.
  3. Een ander probleem met het selecteren van uw afdrukafschriften is dat ze niet altijd onmiddellijk worden weergegeven. Ik heb hiermee verschillende ervaringen gehad voor verschillende executies, dus verwacht geen enkele vorm van consistentie met deze methodologie.

alternatief voor afdrukken binnenkant van een opgeslagen procedure
Dit is echt een soort van icky werk naar mijn mening omdat de syntaxis verwarrend is in de context waaraan het wordt gebruikt, maar wie weet het misschien in de toekomst zal worden bijgewerkt door Microsoft. Ik hou gewoon niet van het idee om een ​​fout te verhogen voor het enige doel van het afdrukken van debug-info …

Het lijkt erop dat de enige manier om dit onderwerp te gebruiken is, zoals al vele keren is uitgelegd, reeds RaisError met NODAIT. Ik bied een voorbeeld en wijzend op een klein probleem met deze aanpak:

ALTER
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample]
AS
BEGIN
    SET NOCOUNT ON;
    -- This will print immediately
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT
    SELECT 1;
    -- Five second delay to simulate lengthy execution
    WAITFOR DELAY '00:00:05'
    -- This will print after the five second delay
    RAISERROR ('RE End', 0, 1) WITH NOWAIT
    SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample]

Beide SELECT-instructie-resultaten worden alleen weergegeven nadat de uitvoering is voltooid en de verklaringen afdrukken worden weergegeven in de bovenstaande volgorde.

potentieel probleem met deze aanpak
Laten we zeggen dat je zowel je afdrukrekening als de Raiserror-statement een na de ander hebt, dan printen ze. Ik weet zeker dat dit iets te maken heeft met buffering, maar wees er gewoon van bewust dat dit kan gebeuren.

ALTER
--CREATE 
    PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2]
AS
BEGIN
    SET NOCOUNT ON;
    -- Both the PRINT and RAISERROR statements will show
    PRINT 'P Start';
    RAISERROR ('RE Start', 0, 1) WITH NOWAIT
    SELECT 1;
    WAITFOR DELAY '00:00:05'
    -- Both the PRINT and RAISERROR statements will show
    PRINT 'P End'
    RAISERROR ('RE End', 0, 1) WITH NOWAIT
    SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample2]

Daarom is het werk hier in de buurt, niet zowel print als raiserror, kies gewoon de een over de andere. Als u wilt dat uw uitvoer wordt weergegeven tijdens de uitvoering van een sproc, gebruik dan RaisError met NOITAIT.


Antwoord 4, Autoriteit 39%

Probeer gebruik:

RAISERROR('your message here!!!',0,1) WITH NOWAIT

U kunt ook proberen over te schakelen naar “Resultaten voor tekst”, wat slechts een paar pictogrammen rechts is voor het recht van “uitvoeren” in de standaardgereedschapsbalk.

Met beide hierboven op zijn plaats, en als u de berichten nog steeds niet ziet, moet u ervoor zorgen dat u dezelfde server / database / eigenaarversie uitvoert van de procedure die u bewerkt is. Zorg ervoor dat u de opdracht Raiserror raakt, maak het de eerste opdracht in de procedure.

Als al het andere faalt, kunt u een tabel maken:

create table temp_log (RowID int identity(1,1) primary key not null
                      , MessageValue varchar(255))

Dan:

INSERT INTO temp_log VALUES ('Your message here')

Dan na het uitvoeren van de procedure (opgeleverd geen terugdraaien), alleen selectde tabel.


Antwoord 5

Bekijk deze HOWTO in de MSDN-documentatie: Voer de TransACT-SQL-debugger uit – het is niet met afdrukafschriften, maar misschien helpt het u hoe dan ook uw code te debuggen.

This YouTube Video: SQL Server 2008 T-SQL Debugger toont het gebruik van de debugger.

= & gt; Opgeslagen procedures zijn geschreven in transacties SQL . Hiermee kunt u alle Transact-SQL-code debuggen en dus het is net het debuggen in visuele studio met het definiëren van breekpunten en het bekijken van de variabelen.

Other episodes