6

我正在运行安装了 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 ......
好吧,我想我必须关心(乔比)。在第 168/169 页的“SQL Server 2008 管理”一书中,还有一个使用 (JOBID) 的示例:

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

结果:
'('附近的语法不正确。(Microsoft SQL Server,错误:102)
我现在完全糊涂了。请有人帮我提供一个好的建议或解决方案。感谢各种帮助。

最好的问候赫尔穆特

4

5 回答 5

6

我们最近遇到了麻烦,没有走你在 MSDN 中找到的路线。相反,我们直接按名称从 dbo.sysjobs 恢复了 jobid(与您的示例相反),然后在作业中使用它来检查执行状态(如果作业状态已更改,则退出长时间运行的 while 循环)。

declare @jobid uniqueidentifier
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]'
于 2010-11-18T11:14:39.643 回答
4

谢谢你的回答。问题是我试图在工作步骤中解析语句。然后我得到了这个错误。在运行作业时没有问题。我现在最好的解决方案是:

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

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

于 2010-11-18T12:07:14.490 回答
3

忘记解析器在说什么——变量解析是在运行时完成的。解析器对此一无所知。

于 2010-11-18T12:24:04.163 回答
2

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

您只能在作业步骤中使用这些令牌。而且,鉴于我们不希望在 jobid 令牌中有任何引号,我会在您引用它时使用 ESCAPE_NONE。

于 2010-11-18T11:40:40.123 回答
0

对于那些需要另一种方法来获取自己的不带宏的作业 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
于 2019-09-24T22:54:36.610 回答