Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выполнение шага CmdExec в джобе (архивация)  [new]
JohnAl
Member

Откуда: Москва
Сообщений: 109
Поиск курил, мануал читал.
Вот такая проблема.
Джоб из двух шагов. Первый запускает план обслуживания (ну допустим бэкап), второй шаг - CmdExec в котором происходит архивация файла rar-ом
Команда такая:
C:\WINRAR\rar.exe a -rr -as -r -dh -df -o- -iloglog.txt F:\Backup_1C_Bases\$(date)_backupdiff.rar F:\Backup_1C_Bases\*.bak
А результат вот какой:
Первый шаг отрабатывает без проблем, а вот на втором ошибка.
Unable to start execution of step 2 (reason: The job step contains tokens. For SQL Server 2005 Service Pack 1 or later, you must use the appropriate ESCAPE_xxx macro to update job steps containing tokens before the job can run.). The step failed.

В переводе как понял, что для SQL старше SP1 (на данном сервере SP2) "...ошибка...причина: шаг работы содержит символы. Для Служебного пакета 2005 Сервера SQL 1 или позже, Вы должны использовать соответствующий макрос ESCAPE_xxx, чтобы обновить шаги джоба, содержащие символы прежде, чем джоб будет запущен".
Т.е. вся проблема в $(date) в имени файла. Если просто напрямую указать имя файла, все срабатывает. Но это мне неудобно. Хотелось бы получать уникальные файлы на каждый запуск джоба. Потому и вставляю дату в имя файла.
И вот что интересно. На других серверах 2005, без сервис-паков все прекрасно работает.
Что посоветуете?
18 фев 09, 12:43    [6833707]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Команда такая:


Эту команду запихайте в файл .cmd b уже его запускайте.
18 фев 09, 12:46    [6833745]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
JohnAl,

а почему бы не задать "тип шага"="Operating system (CmdExec)"?
18 фев 09, 12:52    [6833795]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
Glory
Member

Откуда:
Сообщений: 104751
JohnAl

И вот что интересно. На других серверах 2005, без сервис-паков все прекрасно работает.
Что посоветуете?

Посеветуем делать то, что написано в сообщении и хелпе

In SQL Server 2005 Service Pack 1, the SQL Server Agent job step token syntax has changed. As a result, an escape macro must now accompany all tokens used in job steps, or else those job steps will fail. Using escape macros and updating your SQL Server Agent job steps that use tokens are described in the following sections, "Understanding Using Tokens," "SQL Server Agent Tokens and Macros," and "Updating Job Steps to Use Macros." In addition, the SQL Server 2000 syntax, which used square brackets to call out SQL Server Agent job step tokens (for example, "[DATE]") has also changed. You must now enclose token names in parentheses and place a dollar sign ($) at the beginning of the token syntax. For example:

$(ESCAPE_ macro name (DATE))
18 фев 09, 12:52    [6833799]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
JohnAl,

а почему бы не задать "тип шага"="Operating system (CmdExec)"?
Кажется, Вы так и делаете.
Был невнимателен. Извините.
18 фев 09, 12:57    [6833835]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
JohnAl
Member

Откуда: Москва
Сообщений: 109
На строку C:\WINRAR\rar.exe a -rr -as -r -dh -o- -iloglog.txt F:\Backup_1C_Bases\$(ESCAPE_DAT (DATE))_backupdiff.rar F:\Backup_1C_Bases\*.txt
результат
Syntax error
18 фев 09, 13:54    [6834255]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
Glory
Member

Откуда:
Сообщений: 104751
JohnAl
На строку C:\WINRAR\rar.exe a -rr -as -r -dh -o- -iloglog.txt F:\Backup_1C_Bases\$(ESCAPE_DAT (DATE))_backupdiff.rar F:\Backup_1C_Bases\*.txt
результат
Syntax error

А откуда вы придумали ESCAPE_DAT?
18 фев 09, 13:56    [6834275]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
JohnAl
Member

Откуда: Москва
Сообщений: 109
Да, да, уже сам понял
$(ESCAPE_SQUOTE(DATE))
и все сработало
Спасибо большое за помощь
18 фев 09, 14:03    [6834339]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86) Sep 16 2010 20:09:22 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

После обновления SQL с 2000 на 2008 один из джоб начал выдавать ошибку:
Message
Unable to start execution of step 1 (reason: The job step contains tokens. For SQL Server 2005 Service Pack 1 or later, you must use the appropriate ESCAPE_xxx macro to update job steps containing tokens before the job can run.). The step failed.


Народ подскажите куда вставить параметр ESCAPE_xxx

запрос:

UPDATE AVS_GeneralOrder
SET       OrderStatus = 8, LastActor = 'system'
WHERE (Number IN
                   (SELECT AVS_GeneralOrder.Number
                    FROM   (SELECT Number, DirectDate AS Date
                                    FROM   AVS_Tickets
                                    UNION ALL
                                    SELECT Number, DirectDepartureTime AS Date
                                    FROM  AVS_Ticket_Variants) A INNER JOIN
                                   AVS_GeneralOrder ON A.Number = AVS_GeneralOrder.Number
                    GROUP BY AVS_GeneralOrder.OrderStatus, AVS_GeneralOrder.Number
                    HAVING (NOT (AVS_GeneralOrder.OrderStatus IN (7, 8, 9))) AND (MAX(A.$(DATE)) < GETDATE() - 5) AND (MAX(A.$(DATE)) > GETDATE() - 35))) OR
               (LastDate < GETDATE() - 5) AND (NOT (OrderStatus IN (7, 8, 9))) AND (LastDate > GETDATE() - 35)
29 авг 11, 12:02    [11194067]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
ТАРАКАН
куда вставить параметр ESCAPE_xxx


очевидно, где у вас в запросе проблемное место, указываемое ошибкой:

ТАРАКАН
The job step contains tokens.


Вот сами скажите - вы в своем запросе токены видите?
29 авг 11, 12:22    [11194200]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
ага нашел

AND (MAX(A.$(ESCAPE_NONE(DATE))) < GETDATE() - 5) AND (MAX(A.$(ESCAPE_NONE(DATE)))

наткнулся на хороший скрипт который автоматом меняет

http://support.microsoft.com/kb/915845
29 авг 11, 12:32    [11194288]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение шага CmdExec в джобе (архивация)  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
подскажите так корректно? меня смущают одиночные кавычки в которые пришлось взять иначе не выполняется

            AND (MAX('A.$(ESCAPE_NONE(DATE))') < @DeadDate) 
                    AND (MAX('A.$(ESCAPE_NONE(DATE))') > @DeadDate2))) 


declare @DeadDate DATETIME
declare @DeadDate2 DATETIME
select @DeadDate=DATEADD(DD,-5,GETDATE())
select @DeadDate2=DATEADD(DD,-35,GETDATE())
UPDATE AVS_GeneralOrder
SET       OrderStatus = 8, LastActor = 'system'
WHERE (Number IN
                   (SELECT AVS_GeneralOrder.Number
                    FROM   (SELECT Number, DirectDate AS Date
                                    FROM   AVS_Tickets
                                    UNION ALL
                                    SELECT Number, DirectDepartureTime AS Date
                                    FROM  AVS_Ticket_Variants) A INNER JOIN
                                   AVS_GeneralOrder ON A.Number = AVS_GeneralOrder.Number
                    GROUP BY AVS_GeneralOrder.OrderStatus, AVS_GeneralOrder.Number
                    HAVING (NOT (AVS_GeneralOrder.OrderStatus IN (7, 8, 9))) 
                    AND (MAX('A.$(ESCAPE_NONE(DATE))') < @DeadDate) 
                    AND (MAX('A.$(ESCAPE_NONE(DATE))') > @DeadDate2))) 
                    OR
               (LastDate < @DeadDate) AND (NOT (OrderStatus IN (7, 8, 9))) AND (LastDate > @DeadDate2)
29 авг 11, 13:59    [11194966]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить