Агент SQL Server - получить мой собственный job_id - PullRequest
6 голосов
/ 18 ноября 2010

Я использую 64-разрядную версию SQL Server 2008 Developer Edition с установленным пакетом обновления 1. У меня есть работа агента SQL Server. В рамках этой работы я хочу получить job_id моей собственной работы.
На MSDN (http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx) вы можете найти описание использования токенов на этапах работы. Вау, отлично, это то, что я ищу! Начиная с SQL Server 2005 с пакетом обновления 1 (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» делает неявное преобразование в NVARCHAR из (JOBID) ...
Хорошо, я думаю, что я должен заботиться о типе данных (JOBID). В книге «Администрирование SQL Server 2008» на странице 168/169 также приведен пример использования (JOBID):

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

Результат:
Неверный синтаксис рядом с '('. (Microsoft SQL Server, ошибка: 102)
Я сейчас совершенно сбит с толку. Может ли кто-нибудь помочь мне с хорошим советом или решением. Любая помощь приветствуется.

С наилучшими пожеланиями Helmut

Ответы [ 4 ]

4 голосов
/ 18 ноября 2010

спасибо за ваши ответы. Проблема в том, что я попытался разобрать заявление в шаге работы. Тогда я получил эту ошибку. Во время работы нет проблем. Мое самое лучшее решение сейчас:

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

Теперь вы работаете с @JobID, но, насколько я знаю до сих пор, вы должны всегда конвертировать в char (255). Благодаря пользователю state_dba на MSDN .

3 голосов
/ 18 ноября 2010

Просто забудьте, что говорит парсер - переменное разрешение выполняется во время выполнения.Парсер не знает об этом.

3 голосов
/ 18 ноября 2010

Недавно у нас были проблемы с этим, и мы не пошли по маршруту, который вы нашли в MSDN.Вместо этого мы восстановили jobid из dbo.sysjobs по имени напрямую (в противоположность вашему примеру), а затем использовали его в задании для проверки состояния выполнения (выход из длительного цикла while в случае изменения состояния задания).

declare @jobid uniqueidentifier
SELECT @jobid = job_id from msdb.dbo.sysjobs where name = '[blah]'
2 голосов
/ 18 ноября 2010

Это может показаться очевидным, но я получаю ошибку, которую вы процитировали из вашего первого примера, , если я запускаю ее в окне запроса , но она прекрасно работает, когда я вставляю этот скрипт в шаг задания.

Эти токены можно использовать только на рабочих этапах. И, учитывая, что мы не ожидаем каких-либо кавычек в маркере jobid, я буду использовать ESCAPE_NONE всякий раз, когда вы ссылаетесь на него.

...