windows - Fejlhåndtering med batchfil & sqlcmd

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en batch-fil, der kører nogle SELECT-forespørgsler ved hjælp af sqlcmd, sætter resultaterne i tekstfiler og uploader disse filer til en FTP-server. Det er alt, der fungerer lige som det skal, hvilket er, hvordan jeg kan lide ting at arbejde.


Jeg har undret mig over, hvad jeg ville gøre i tilfælde af en fejl. Lad os sige, at nogen ændrer datastrukturen i databasen, som jeg rammer og ikke fortæller mig. Hvis jeg kørte en sqlcmd SELECT-sætning og faldt resultatet i en tekstfil, ville jeg lige ender med en tekstfil indeholdende en fejl, som derefter gik direkte til FTP som om der ikke var noget galt. (Jeg har testet dette.)


Jeg vil gerne være i stand til at kontrollere for fejl, der kommer fra sqlcmd - timeouts, dårlige referencer, fejlformet forespørgsel osv. Osv. Jeg er bare ikke sikker på, hvordan dette er gjort eller hvad 'bedste praksis' er. Jeg kunne altid forsøge at gennemgå output-tekstfilen og søg efter fejl, som jeg tror, ​​kan ske, men det er problematisk for et antal grunde.


Nogen har nogen erfaring med dette, at de 'plejer at dele?

Bedste reference


Du kan tjekke errorlevel returneret fra SQLCMD for at se, om den mislykkedes.


    sqlcmd -b <yourscript>
    IF ERRORLEVEL 1 goto err\_handler
    goto done
    :err\_handler
    REM handle the error here

    :done 
    REM script completion code here

Andre referencer 1


Jeg vil måske starte med at sætte returværdier i din SQL, som sådan:


DECLARE @IsBored bit = 1

... do work ...

SELECT 0 -- Success!


Du kan tage det lidt længere og bruge TRY/CATCH-blokke til at fange fejl og returnere en fejlkode. Med SQLCMD kan du bruge returkoden fra din SQL som udgangskode for programmet, som sådan:


sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" 
       -o "C:Logsoutput.log" -u


Hvis du administrerede dine SQLCMD-opkald med noget som en planlægger, kan du tage handling baseret på returkoder fra SQLCMD. Da du bare bruger batch-filer, tror jeg, du kan gøre noget som dette:


@ECHO OFF
sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" 
       -o "C:Logsoutput.log" -u
IF \%ERRORLEVEL\% NEQ 0 ECHO "Error"


Held og lykke!

Andre referencer 2


for \%\%G in (*.sql) do (sqlcmd /S \%sqlhost\% /d \%sqldbname\% -E -b -i "\%\%G" >> output.txt if ERRORLEVEL 1 exit)


Ovenstående kode løber gennem alle * .sql i en mappe. Hvis der opstår en fejl i et af scriptet, bliver fejlen logget ind i output.txt-filen, og den stopper batchprocessen med det samme.

Andre referencer 3


Jeg lavede et minilanguage i python for at løse et lignende problem. Ved hjælp af subprocess biblioteket kan du køre din kode gennem sqlcmd, så få output og eventuelle fejlkoder. Parse outputet, før du lægger det i din tekstfil, og om nødvendigt gennemgå fejlreparationstilstande. Disse stater kan ændre koden eller mulighederne og forsøge at sende dem gennem sqlcmd. Hvis alt andet fejler, mail et menneske.


Selvfølgelig, siden jeg brugte python på den måde, stod jeg slet ikke med sqlcmd og brugte lige odbc python-bibliotekerne til direkte forbindelse til databasen. Jeg kunne vende tilbage til mine transaktioner, hvis jeg havde et katastrofalt svigt, køre det i interaktive tilstand eller via en kommandofil mv. osv.


Det er dog en bunke af arbejde. For mere forenklet fejlkontrol, skal du blot tilføje et filter til din pipeline, siger grep eller awk. Eller rul din egen med flex.