SQL Server代理 - 获取我的作业ID

8
我正在运行安装了Service Pack 1的SQL Server 2008 64位开发者版。我有一个SQL Server代理作业。在这个作业中,我想获取我的作业的job_id。
在MSDN(http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx)上,您可以找到有关在作业步骤中使用令牌的说明。哇,太棒了,这就是我要找的!!只需使用(JOBID)。
自SQL Server 2005 SP1以来,您必须使用类似$(ESCAPE_NONE(JOBID))的宏。没有问题。
但是,如果您尝试以下示例:

DECLARE @name NVARCHAR(128)
select @name =  name from msdb.dbo.sysjobs where job_id = $(ESCAPE_SQUOTE(JOBID))
PRINT @name

你得到的错误信息是:
“ESCAPE_SQUOTE”附近有语法错误。(Microsoft SQL Server, 错误代码:102)
现在,从头开始:

PRINT N'$(ESCAPE_SQUOTE(JOBID))'  

结果为 0xE33FE637C10B3C49A6E958BB3EF06959,但 job_id 是 37E63FE3-0BC1-493C-A6E9-58BB3EF06959。
我认为 "N'" 会将 (JOBID) 隐式转换为 NVARCHAR...
好的,我想我需要关注 (JOBID) 的数据类型。在书籍《SQL Server 2008 Administration》的第168/169页中也有使用 (JOBID) 的示例:

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

结果为:
附近有'('的语法不正确。(Microsoft SQL Server,错误:102)
我现在完全困惑了。请问有人能给我提供一个好的建议或解决方案吗?任何形式的帮助都将不胜感激。

最好的祝福 Helmut

5个回答

7
我们最近遇到了麻烦,没有采用MSDN中您找到的方法。相反,我们通过名称直接从dbo.sysjobs中恢复了jobid(与您的示例相反),然后在作业中使用它来检查执行状态(如果作业状态已更改,则退出长时间运行的while循环)。
declare @jobid uniqueidentifier
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]'

5
感谢您的回答。问题是我尝试解析作业步骤中的语句,然后出现了这个错误。在运行作业时没有问题。我目前最好的解决方案是:
declare @JobID uniqueidentifier
SELECT @JobID = $(ESCAPE_NONE(JOBID));
PRINT 'My JobID is  ' + Convert(char(255), @JobID)  

现在你正在处理@JobID,但据我所知,直到现在你必须始终转换为char(255)。感谢MSDN上的用户state_dba。

3

不要管解析器在说什么 - 变量解析是在运行时完成的。解析器并不知道这一点。


2

这可能听起来很明显,但是如果我在查询窗口中运行您第一个示例中引用的脚本,我会得到您引用的错误,但是当我将该脚本粘贴到作业步骤中时,它可以完美运行。

您只能在作业步骤中使用这些标记。而且,考虑到我们不希望在作业ID标记中出现任何引号,因此每当您引用它时,我建议使用ESCAPE_NONE。


1

对于那些需要在没有宏的情况下获取自己的作业 ID 的替代方法的人,例如从作业步骤调用的存储过程中。我在这里找到了以下内容。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接