SQL Server 代理 - 获取我自己的 job_id
-
26-09-2019 - |
题
我正在运行安装了 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”附近的语法不正确。(微软 SQL Server,错误:102)
好的,现在从头开始:
PRINT N'$(ESCAPE_SQUOTE(JOBID))'
结果在0xE33FE637C10B3C49A6E6E6E6E6E6E6E6E6EFB3EF06959中,但JOB_ID为37E63FE3-0BC1-493C-A6E6E9-A6E9-58BB3EF06959
我认为“N”隐式转换为 (JOBID) 的 NVARCHAR...
好吧,我想我必须关心(JOBID)的数据类型。在《SQL Server 2008 Administration》一书中的第 168/169 页中,还有一个使用 (JOBID) 的示例:
declare @jobid binary(16)
SELECT @jobid =Convert(Uniqueidentifier,$(ESCAPE_NONE(JOBID)))
结果是:
“(”附近的语法不正确。(微软 SQL Server,错误:102)
我现在完全糊涂了。请有人帮助我提供好的建议或解决方案。感谢各种帮助。
最好的问候Helmut
解决方案
就忘了什么解析器说 - 可变分辨率是在运行时完成。解析器不知道。
其他提示
感谢您的回答。问题是我试图解析作业步骤中的语句。然后我得到了这个错误。运行作业时没有问题。我现在最好的解决方案是:
declare @JobID uniqueidentifier
SELECT @JobID = $(ESCAPE_NONE(JOBID));
PRINT 'My JobID is ' + Convert(char(255), @JobID)
现在您使用 @JobID 进行处理,但据我所知,到目前为止您必须始终转换为 char(255)。感谢用户state_dba 微软软件定义网络.
我们最近有这样的烦恼并没有去你在MSDN中找到的路线。相反,我们的名字从回收的dbo.sysjobs直接作业ID(你的例子相反),然后使用该作业中检查执行状态(的长时间运行的退出了while循环,如果工作状态发生了变化)。
declare @jobid uniqueidentifier
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]'
这听起来可能很明显,但我让你从你的第一个样品引述错误,的如果我在一个查询窗口中运行它的,但它完美地运行良好,当我粘贴脚本转换为作业步骤
您只能使用作业步骤中的这些令牌。而且,因为我们不希望在作业ID令牌,我会使用ESCAPE_NONE只要你引用它。
任何报价对于那些需要一种替代方法来获得,而不宏自己的作业ID,例如,从一个存储过程,一个作业步的呼叫内。我发现了以下这里
DECLARE @SQL NVARCHAR(72),
@jobID UNIQUEIDENTIFIER,
@jobName SYSNAME
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