我正在运行安装了 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top