web-dev-qa-db-fra.com

Qu'est-ce qui est pris en compte pour la sortie d'une étape de travail SQL Server?

En bref : Il semble que je reçois uniquement des messages d'impression sur mon historique des tâches SQL Server. Quelle est la définition de la sortie d'historique valide?

arrière-plan : juste exécuter une déclaration comme UPDATE product SET ... ne laissera aucune trace dans l'historique des tâches (si "incluez la sortie de l'étape dans l'historique" est cochée ou non). Exécution de la même instruction dans Query Analyzer montre "(x lignes (s) touchées (s))".

En créant une variable et en l'affectant, le contenu @@ RowCount après la mise à jour, je peux créer et imprimer un message qui inclura le nombre de lignes affectées. Cela sera inclus dans l'historique des tâches. Cela fonctionne bien, mais j'aimerais connaître la définition de sortie (qui est écrite sur l'historique) d'une étape de travail de script transact-sql. Qu'est-ce qui est inclus à l'exception des chaînes imprimées?

On pourrait facilement penser que l'histoire montrerait exactement la même chose que celle indiquée dans le volet Messages de la fenêtre de requête (anciennement appelé Analyseur de requête) du studio de gestion Server SQL Server - mais ce n'est pas le cas.

6
Andreas Jansson

Pour les étapes de travail T-SQL, la "sortie" fait référence à "Messages" - Avis envoyés via PRINT et RAISERROR. Les ensembles de résultats sont également inclus comme "sortie", mais uniquement s'il n'y a pas PRINT/RAISERROR messages, sinon ce n'est que les messages PRINT/RAISERROR messages qui sont inclus.

Essayez ce test:

Job Step 1

Définition:

PRINT ' ** Line 1 ** ';

SELECT ' ** Line 2 ** ' AS [Line Two];

RAISERROR(' ** Line 3 ** ', 10, 1);

Sortie dans l'historique des tâches:

Un message
[.____] exécuté en tant qu'utilisateur: Service NT\SQLServeragent. ** Ligne 1 ** [sqlstate 01000] (message 0) ** Ligne 3 ** [SQLSTATE 01000] (Message 50000). L'étape a réussi.

Job Step 2

Définition:

SELECT ' ** Line B1 ** ' AS [Line B-One];

--PRINT ' ** Line B2 ** '; -- uncomment and output will show this and not "Line B1"

Sortie dans l'historique des tâches:

Un message
[.____] exécuté en tant qu'utilisateur: Service NT\SQLServeragent. Ligne B-One
----------------
[.____] ** Ligne B1 **
[.____] (1 rangée (s) touchée (s)). L'étape a réussi.

étape

Définition:

PRINT ' ** Start ** ';

RAISERROR(' ** Test Exception ** ', 16, 1);

PRINT ' ** End ** ';

Sortie dans l'historique des tâches:

Un message
[.____] exécuté en tant qu'utilisateur: Service NT\SQLServeragent. ** Démarrer ** [sqlstate 01000] (message 0) ** Exception de test ** [SQLSTATTE 42000] (ERREUR 50000) ** FIN ** [SQLSTATE 01000] (message 0). L'étape a échoué.


En ce qui concerne la déclaration suivante dans la question:

On pourrait facilement penser que l'histoire montrerait exactement la même chose que celle indiquée dans le volet Messages de la fenêtre de requête [dans SSMS] [par exemple: "(x (x) rangée (s) affectée)"]

On pourrait certainement penser que, mais ce qui est montré dans l'onglet Messages de SSMS n'est pas nécessairement une sortie directe de SQL Server. Les SSMS "X lignes (s) affectées" sont générés par SSMS en fonction de l'information qu'il reçue de SQL Server qui n'était pas une sortie directe, mais des informations supplémentaires qui reviennent dans le flux de données tabulaire (TDS). La même chose s'applique à l'itération par lots à l'aide de "go x" où le x est un entier qui dit à SSMS combien de fois de soumettre ce lot particulier (celui qui se terminait par le séparateur de lots "Go"). La sortie dans l'onglet "Messages" afficherait Beginning execution loop et à la fin Batch execution completed 4 times., mais ce sont des messages de SSMS et non de SQL Server.

7
Solomon Rutzky

Si vous dirigez la sortie pour l'étape dans une "table", comme ceci:

enter image description here

Vous pouvez voir tout sortie de la dernière course du travail, y compris PRINT, RAISERROR et résultats des requêtes , en regardant dans la base de données MSDB à la dbo.sysjobstepslogs tableau:

SELECT JobName = sj.name
    , StepName = sjs.step_name
    , DateModified = sjsl.date_modified
    , LogText = sjsl.log
FROM dbo.sysjobs sj
    INNER JOIN dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
    INNER JOIN dbo.sysjobstepslogs sjsl ON sjs.step_uid = sjsl.step_uid;

Un gotcha, vous devrez copier-coller le contenu de la colonne LogText dans le bloc-notes (ou éditeur de votre choix) pour voir plusieurs lignes de sortie.

Avec un travail défini comme suit:

USE [msdb]
GO

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'TestOutput', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'[login_name]', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [Step1]    Script Date: 4/14/2016 2:41:19 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Step1', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'SELECT d.name
FROM sys.databases d
WHERE d.database_id > 4
ORDER BY d.name;

PRINT ''test'';', 
        @database_name=N'master', 
        @flags=8
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO

La sortie de la requête ressemble à:

enter image description here

et le texte copier-coller ressemble à:

Job 'TestOutput' : Step 1, 'Step1' : Began Executing 2016-04-14 14:38:44

name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
Test

(1 rows(s) affected)

test [SQLSTATE 01000]
3
Max Vernon