6
votes

SQL Server Agent - Obtenez mon propre emploi_id

Je suis en cours d'exécution d'une édition de développeur SQL Server 2008 64 bits avec Service Pack 1 installé. J'ai un travail d'agent SQL Server. Dans ce travail, je veux obtenir le job_id de mon propre travail.
Sur msdn ( http://msdn.microsoft.com /en-us/Library/ms175575(v=SQL.100).aspx ) Vous pouvez trouver une description d'utiliser des jetons dans les étapes du travail. Wow, génial, c'est ce que je cherche !! Il suffit d'utiliser (Jobid).
Étant donné que SQL Server 2005 SP1, vous devez utiliser Macro comme $ (Escape_none (Jobid)). Pas de problème.
Mais si vous essayez l'exemple:

declare @jobid binary(16)
SELECT @jobid =Convert(Uniqueidentifier,$(ESCAPE_NONE(JOBID)))


0 commentaires

5 Réponses :


6
votes

Nous avons eu des problèmes avec cela récemment et nous ne sommes pas allé l'itinéraire que vous avez trouvé dans MSDN. Au lieu de cela, nous avons récupéré le JOBID à partir de DBO.SYSJOBS par son nom directement (le contraire de votre exemple), puis utilisé dans le travail pour vérifier l'état d'exécution (sortie de longue durée pendant la boucle si l'état d'emploi avait changé).

declare @jobid uniqueidentifier
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]'


0 commentaires

2
votes

Cela peut sembler évident, mais j'obtiens l'erreur que vous avez citée à partir de votre premier échantillon, si je l'exécute dans une fenêtre de requête , mais cela fonctionne parfaitement quand je colle ce script dans une étape de travail .

Vous ne pouvez utiliser que ces jetons dans les étapes du travail. Et, étant donné que nous ne nous attendions à aucune citations dans le jeton Jobid, j'utiliserais Escape_none chaque fois que vous le référez.


0 commentaires

4
votes

Merci pour vos réponses. Le problème est que j'ai essayé d'analyser la déclaration dans l'étape du travail. Ensuite, j'ai eu cette erreur. En exécutant le travail, il n'y a pas de problème. Ma meilleure solution est la meilleure solution:

declare @JobID uniqueidentifier
SELECT @JobID = $(ESCAPE_NONE(JOBID));
PRINT 'My JobID is  ' + Convert(char(255), @JobID)  


0 commentaires

3
votes

oublier juste ce que le parseur dit - la résolution variable est effectuée au moment de l'exécution. L'analyseur ne sait pas à ce sujet.


0 commentaires

0
votes

Pour ceux qui ont besoin d'une méthode alternative pour obtenir votre propre identifiant de travail sans macros, par exemple, à partir d'une procédure stockée qui appelle une étape de travail. J'ai trouvé ce qui suit ici

DECLARE @SQL NVARCHAR(72),
@jobID UNIQUEIDENTIFIER,
@jobName SYSNAME

IF SUBSTRING(APP_NAME(),1,8) = 'SQLAgent'
BEGIN 
    SET @SQL = 'SET @guid = CAST(' + SUBSTRING(APP_NAME(), 30, 34) + ' AS UNIQUEIDENTIFIER)'

    EXEC    sp_executesql @SQL, N'@guid UNIQUEIDENTIFIER OUT', @guid = @jobID OUT

    SELECT  @jobName = name
    FROM    msdb..sysjobs
    WHERE   job_id = @jobID
END


0 commentaires