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.
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.
Si vous dirigez la sortie pour l'étape dans une "table", comme ceci:
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 à:
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]