2010-11-18 2 views
6

Я запускаю 64-разрядную версию разработчика SQL Server 2008 с пакетом обновления 1 (SP1). У меня есть работа агента SQL Server. В рамках этой работы я хочу получить job_id своей работы.
В MSDN (http://msdn.microsoft.com/en-us/library/ms175575(v=SQL.100).aspx) вы можете найти описание использования токенов в шагах задания. Ничего себе, отлично, вот что я ищу! Просто используйте (JOBID).
С SQL Server 2005 с пакетом обновления 1 (SP1) вы должны использовать макрос как $ (ESCAPE_NONE (JOBID)). Нет проблем.
Но если вы попытаетесь пример:Агент SQL Server - получить свой собственный job_id

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" I думаю делает неявное преобразование в NVARCHAR (JOBID) ...
Хорошо, я думаю, что мне нужно заботиться о типе данных (JOBID). В книге "SQL Server 2008 Administration" на стр 168/169 есть также пример использования (JobId):

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

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

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

ответ

3

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

3

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

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

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

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

4

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

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

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