Поделиться через


Использование маркеров в шагах задания

Изменения: 14 апреля 2006 г.

Агент SQL Server позволяет применять маркеры в сценариях шагов заданий на языке Transact-SQL. Применение маркеров при написании шагов заданий обеспечивают такую же гибкость, какую дают переменные при написании программ. После добавления маркера в сценарий шага задания агент SQL Server замещает маркер во время выполнения, до того как шаг задания выполняется подсистемой Transact-SQL

ms175575.note(ru-ru,SQL.90).gifВажно!
В пакете обновления 1 SQL Server 2005 синтаксис маркера шага задания агента SQL Server изменился. В результате управляющий макрос должен сопровождать все маркеры, используемые в шагах заданий, иначе произойдет сбой в шагах заданий. Использование управляющих макросов и обновление шагов заданий агента SQL Server, в которых используются маркеры, описывается в разделах «Основные сведения об использовании маркеров», «Макросы и маркеры агента SQL Server» и «Обновление шагов заданий для использования маркеров». Кроме того, также изменился синтаксис SQL Server 2000, при котором для обнаружения маркеров шагов заданий SQL Server (например «[DATE]») использовались квадратные скобки. Теперь имена маркеров необходимо заключать в круглые скобки и в начале записи маркера добавлять знак доллара ($). Например: $(ESCAPE_имя макроса(DATE))

Основные сведения об использовании маркеров

ms175575.security(ru-ru,SQL.90).gifПримечание безопасности.
Все пользователи Windows с разрешением на запись в журнал событий Windows могут получить доступ к шагам заданий, которые активируются предупреждениями агента SQL Server или предупреждениями инструментария WMI. Чтобы избежать этого нарушения безопасности, в SQL Server маркеры агента, которые могут использоваться в заданиях, активированных предупреждениями, по умолчанию отключены. Такими маркерами являются: A-DBN, A-SVR, A-ERR, A-SEV, A-MSG. и WMI(свойство). Если необходимо использовать эти маркеры, сначала убедитесь, что разрешением на работу с журналом событий компьютера, на котором находится SQL Server, обладают только члены доверенных групп безопасности Windows, таких как группа «Администраторы». Затем, чтобы включить эти маркеры, щелкните правой кнопкой мыши элемент Агент SQL Server в обозревателе объектов, выберите пункт меню Свойства и на странице Система предупреждений выберите Заменять маркеры всех ответов заданий на предупреждения.

Замена маркеров агента SQL Server проста и эффективна: Агент SQL Server заменяет маркер точной символьной строкой. Все маркеры обрабатываются с учетом регистра. Шаги заданий должны это учитывать для учетной записи и правильно заключать в кавычки применяемые маркеры или преобразовывать замещающие строки к верному типу данных.

Например, чтобы напечатать имя базы данных в шаге задания, можно использовать следующую инструкцию:

PRINT N'Current database name is $(ESCAPE_SQUOTE(A-DBN))' ;

В этом примере макрос ESCAPE_SQUOTE добавляется с маркером A-DBN. Во время выполнения маркер A-DBN будет замещен соответствующим именем базы данных. Управляющий макрос экранирует все одиночные кавычки, которые случайно передаются в строку замещения маркера. Агент SQL Server заместит символ одиночной кавычки двумя символами одиночной кавычки в конечной строке.

Например, если замещающая маркер строка AdventureWorks'SELECT @@VERSION --, то команда, выполняемая агентом SQL Server имеет вид:

PRINT N'Current database name is AdventureWorks''SELECT @@VERSION --' ;

В этом случае добавленная инструкция SELECT @@VERSION не выполняется. Вместо этого, дополнительный символ одинарной кавычки заставляет сервер анализировать передаваемую инструкцию как строку. Если замещающая маркер строка не содержит одинарных кавычек, то никакие символы не экранируются, и шаг задания, содержащий маркер, выполняется как планировалось.

Чтобы отладить использование маркеров в шагах заданий, используйте инструкции вывода на печать, такие как PRINT N'$(ESCAPE_SQUOTE(SQLDIR))' и сохраняйте выходные данные шага задания в файл или таблицу. Используйте страницу Дополнительно диалогового окна Свойства шага задания для указания выходного файла или таблицы для шага задания.

Маркеры и макросы агента SQL Server

В следующей таблице перечислены и описаны маркеры и макросы, которые поддерживает агент SQL Server.

Маркеры агента SQL Server

Маркер Описание

(A-DBN)

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

(A-SVR)

Имя сервера. Если задание запускается в результате предупреждения, то имя сервера автоматически замещает в шаге задания этот маркер.

(A-ERR)

Номер ошибки. Если задание запускается в результате предупреждения, то номер ошибки автоматически замещает в шаге задания этот маркер.

(A-SEV)

Серьезность ошибки. Если задание запускается в результате предупреждения, то степень серьезности ошибки автоматически замещает в шаге задания этот маркер.

(A-MSG)

Текст сообщения. Если задание запускается в результате предупреждения, то текст сообщения автоматически замещает в шаге задания этот маркер.

(DATE)

Текущая дата (в формате ГГГГММДД).

(INST)

Имя экземпляра. Для экземпляра по умолчанию этот маркер пустой.

(JOBID)

Идентификатор задания.

(MACH)

Имя компьютера.

(MSSA)

Имя главной службы SQLServerAgent.

(OSCMD)

Префикс для программы, используемой для запуска шагов задания CmdExec.

(SQLDIR)

Каталог, в котором установлен SQL Server. Значение по умолчанию — «C:\Program Files\Microsoft SQL Server\MSSQL».

(STEPCT)

Количество выполнений этого шага (кроме повторных попыток). Может применяться командой шага для принудительного прекращения цикла из нескольких шагов.

(STEPID)

Идентификатор шага.

(SRVR)

Имя компьютера, на котором работает SQL Server. В случае именованного экземпляра SQL Server имя компьютера включается в имя экземпляра.

(TIME)

Текущее время (в формате ЧЧММСС).

(STRTTM)

Время запуска задания (в формате ЧЧММСС).

(STRTDT)

Дата запуска задания (в формате ГГГГММДД).

(WMI(property))

Для заданий, запускаемых в ответ на предупреждение инструментария WMI, значение свойства указывается параметром property. Например, маркер $(WMI(DatabaseName)) предоставляет значение для свойства DatabaseName в событии инструментария WMI, которое вызвало предупреждение.

Управляющие макросы агента SQL Server

Управляющие макросы Описание

$(ESCAPE_SQUOTE(имя_маркера))

Экранирует символы одинарных кавычек (') в строке замещения маркера. Замещает символ одинарной кавычки двумя символами одинарной кавычки.

$(ESCAPE_DQUOTE(имя_маркера))

Экранирует символы двойных кавычек (") в строке замещения маркера. Замещает символ двойных кавычек двумя символами двойных кавычек.

$(ESCAPE_RBRACKET(имя_маркера))

Экранирует символы правой квадратной скобки (]) в строке замещения маркера. Замещает один символ правой квадратной скобки двумя символами правой квадратной скобки.

$(ESCAPE_NONE(имя_маркера))

Замещает маркер, не экранируя никакие символы строки. Этот макрос предоставлен для поддержки обратной совместимости в окружениях, где строки замещения маркера ожидаются только от надежных пользователей. Дополнительные сведения см. в подразделе «Обновление шагов заданий для использования маркеров» далее в этом разделе.

Обновление шагов заданий для использования маркеров

В пакете обновления 1 SQL Server 2005 шаги заданий, содержащие маркеры без экранирующих символов завершатся сбоем и возвратят сообщение об ошибке; это сообщение показывает, что шаг задания содержит один или более маркеров, которые необходимо обновить с помощью макроса перед тем, как задание можно выполнить.

Предоставляется сценарий вместе со статьей базы знаний Microsoft SQL Server Agent Job Steps That Use Tokens Fail in SQL Server 2005 Service Pack 1. Этот сценарий можно использовать, чтобы обновить все шаги заданий, которые используют маркеры с макросом ESCAPE_NONE. После применения этого сценария рекомендуется как можно скорее просмотреть шаги заданий, в которых используются маркеры, и заменить макрос ESCAPE_NONE управляющим макросом, который соответствует контексту шага задания.

В следующей таблице показано, как замена маркеров обрабатывается агентом SQL Server в пакете обновления 1 SQL Server 2005. Чтобы включить или выключить предупреждение о замещении маркеров, щелкните правой кнопкой мыши агент SQL Server в обозревателе объектов, выберите пункт меню Свойства и на странице Система предупреждений установите или снимите флажок Заменить маркеры всех ответов заданий на предупреждения.

Синтаксис маркера Предупреждение о замене маркеров включено Предупреждение о замене маркеров отключено

Управляющие макросы используются

Все маркеры в заданиях заменяются успешно.

Маркеры, активированные предупреждениями, не заменяются. К этим маркерам относятся A-DBN, A-SVR, A-ERR, A-SEV, A-MSG и WMI(property). Другие статические маркеры заменяются успешно.

Управляющие макросы не используются

Все задания, содержащие маркеры, завершаются сбоем.

Все задания, содержащие маркеры, завершаются сбоем.

Примеры обновления синтаксиса маркеров

А. Использование маркеров в невложенных строках

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

PRINT N'Current database name is $(A-DBN)' ;

После выполнения обновляющего сценария макрос ESCAPE_NONE добавляется перед маркером A-DBN. Так как для отделения строки печати используются одинарные кавычки, необходимо обновить шаг задания, добавив макрос ESCAPE_SQUOTE следующим образом:

PRINT N'Current database name is $(ESCAPE_SQUOTE(A-DBN))' ;

Б. Использование маркеров во вложенных строках

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

Например, рассмотрим следующий шаг задания, в котором используется маркер A-MSG и который не был обновлен с помощью управляющего макроса:

PRINT N'Print ''$(A-MSG)''' ;

После выполнения обновляющего сценария макрос ESCAPE_NONE добавляется с маркером. Однако, в этом случае необходимо переписать сценарий, чтобы не использовалось вложение, как показано ниже, и добавить макрос ESCAPE_SQUOTE, чтобы правильным образом экранировать разделители, которые могут быть переданы в строку замены маркера:

DECLARE @msgString nvarchar(max)

SET @msgString = '$(ESCAPE_SQUOTE(A-MSG))'

SET @msgString = QUOTENAME(@msgString,'''')

PRINT N'Print ' + @msgString ;

Имейте в виду, что функция QUOTENAME устанавливает символ кавычки.

В. Использование маркеров с макросом ESCAPE_NONE

Следующий пример является частью сценария, который извлекает job_id из таблицы sysjobs и использует маркер JOBID, чтобы заполнить переменную @JobID, которая была объявлена как бинарный тип данных ранее в сценарии. Имейте в виду, что с маркером JOBID используется макрос ESCAPE_NONE, так как для бинарного типа данных разделители не требуются. После выполнения сценария обновления не нужно обновлять этот шаг задания.

SELECT * FROM msdb.dbo.sysjobs

WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ;

См. также

Другие ресурсы

sp_add_jobstep (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Новое содержимое:
  • Добавлены сведения об изменении синтаксиса маркеров в SQL Server 2005, что требует добавления управляющего макроса во все шаги заданий, где используются маркеры.