【问题标题】:SQL Server Agent - get my own job_idSQL Server 代理 - 获取我自己的 job_id
【发布时间】:2010-11-18 10:38:33
【问题描述】:

我正在运行安装了 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)的数据类型。在第 168/169 页的“SQL Server 2008 管理”一书中,还有一个使用 (JOBID) 的示例:

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

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

最好的问候 赫尔穆特

【问题讨论】:

    标签: sql-server sql-agent sql-agent-job


    【解决方案1】:

    我们最近遇到了这个问题,没有按照您在 MSDN 中找到的路线进行。相反,我们直接按名称从 dbo.sysjobs 中恢复了 jobid(与您的示例相反),然后在作业中使用它来检查执行状态(如果作业状态发生变化,则退出长时间运行的 while 循环)。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        忘记解析器在说什么——变量解析是在运行时完成的。解析器不知道这一点。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            对于那些需要另一种方法来获取自己的不使用宏的作业 ID(例如,从作业步骤调用的存储过程中)的用户。我找到了以下here

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-21
              • 2017-12-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多