В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

Браузер не поддерживается

Чтобы использовать веб-сайт, обновите браузер.

Обновите браузер до последней версии Internet Explorer

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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:915845
Номер ошибки: 426808 (SQLBUDT)
Проблема
После установки Microsoft SQL Server 2005 с пакетом обновления 1 (SP1) возникают следующие проблемы:
  • При заданий содержит шаги задания, использующие маркеры сбой задания агента SQL Server.
  • Появляется следующее сообщение об ошибке:
    Шаг задания содержит один или несколько маркеров. Для SQL Server 2005 с пакетом обновления 1 или более поздней версии все шаги необходимо обновить с помощью макроса можно запустить задание.
Примечание Данная проблема возникает с построения 2046 или более поздней версии SQL Server 2005.
Причина
В SQL Server 2005 SP1 изменился синтаксис маркера шага задания агента SQL Server. Теперь необходимо включить управляющего макроса с все маркеры, используемые в шагах заданий. Если не включать управляющего макроса, эти шаги не удастся. В следующей таблице перечислены экранирующие макросы.
Управляющие макросыОписание
$(ESCAPE_SQUOTE) (TokenName))Этот макрос экранирует апострофы (') в строке замещения маркера. Макрос заменяет один апостроф два апострофы.
$(ESCAPE_DQUOTE) (TokenName))Этот макрос экранирует символы кавычек (") в строке замещения маркера. Макрос заменяет двойные кавычки одинарную кавычку.
$(ESCAPE_RBRACKET) (TokenName))Этот макрос экранирует правых скобок ([]) в строке замещения маркера. Макрос заменяет один символ правой квадратной две правых скобок.
$(ESCAPE_NONE)TokenName))Макрос замещает маркер не экранируя никакие символы строки. Этот макрос предоставлен для поддержки обратной совместимости в средах, где строки замещения маркера ожидаются только от доверенных пользователей.
Например, шаг задания может содержать следующую инструкцию Transact-SQL, использующего A-DBN маркер:
CREATE DATABASE [$(A-DBN)]
В этом примере необходимо обновить синтаксис маркера на следующий синтаксис:
CREATE DATABASE [$(ESCAPE_RBRACKET(A-DBN))]
Это изменение отличается от предыдущего поведения SQL Server 2005, где экранирующие макросы не требовались.
Решение
Чтобы устранить эту неполадку, обновите всех или только определенных заданий, которые используют маркеры для нового синтаксиса маркеров. Чтобы сделать это, используйте sp_AddEscapeNoneToJobStepTokens Хранимая процедура. Эту хранимую процедуру можно создать с помощью следующего сценария Transact-SQL.

Примечание Убедитесь, что сборки SQL Server 2005 с пакетом обновления 1, необходимо установить построения 2046 или более. Кроме того необходимо быть членом фиксированной серверной роли sysadmin для выполнения сценария.
      -- This script is used to automatically edit SQL Agent job steps so that-- unescaped tokens are prefaced with the ESCAPE_NONE syntax that was added in-- SQL Server 2005 SP1.if (@@microsoftversion < 0x90007FE)BEGIN    RAISERROR('This script should only be run on at least SQL Server 2005 SP1.', 20, 127) WITH LOG    returnENDuse msdbgoif exists (select * from sys.objects where name = N'fn_PrefaceTokensWithEscapeNone' and type = 'FN')    drop function fn_PrefaceTokensWithEscapeNonego-- This function manipulates @commands so that all bare tokens-- are prefaced with ESCAPE_NONE.create function fn_PrefaceTokensWithEscapeNone(@commands nvarchar(max)) RETURNS nvarchar(max)ASBEGIN    if (@commands IS NULL)    BEGIN        return @commands    END    -- In order to let this script run under SQLCMD mode, we define    -- the special "$(" variable start string by concatenation so that    -- sqlcmd mode does not think that we are defining one of its variables.    declare @strVariableStart nchar(2)    select @strVariableStart = N'$' + N'('    declare @idxTokenStart int    select @idxTokenStart = CHARINDEX(@strVariableStart, @commands)    while (@idxTokenStart != 0 and @idxTokenStart is not null)    BEGIN        declare @idxCloseParen int        select @idxCloseParen = CHARINDEX(N')', SUBSTRING(@commands, @idxTokenStart, LEN(@commands)))        -- Error checking. If there is no close parenthesis, return.        if (0 = @idxCloseParen)        BEGIN            return @commands        END        -- Deduce the token variable.        declare @tokenLen int        select @tokenLen = @idxCloseParen - LEN(@strVariableStart) - 1        declare @token nvarchar(max)        select @token = SUBSTRING(@commands, @idxTokenStart + LEN(@strVariableStart), @tokenLen)        -- Verify if @token contains a mis-matched number of open and        -- close parens. This behavior could happen if invalid syntax is        -- in a comment block. If so, skip to the next token.        declare @idx int        declare @cOpenParens int        declare @cCloseParens int        select @cOpenParens = 0        select @idx = CHARINDEX(N'(', @token);        while (@idx != 0)        BEGIN            select @cOpenParens = @cOpenParens + 1            select @idx = CHARINDEX(N'(', @token, @idx + 1);        END        select @cCloseParens = 0        select @idx = CHARINDEX(N')', @token);        while (@idx != 0)        BEGIN            select @cCloseParens = @cCloseParens + 1            select @idx = CHARINDEX(N')', @token, @idx + 1);        END        -- Special case for the WMI token.        if (N'WMI(' = SUBSTRING(@token, 1, LEN(N'WMI(')))        BEGIN                select @cOpenParens = @cOpenParens - 1        END        if ((@cOpenParens = @cCloseParens) and            (N'ESCAPE_NONE(' != SUBSTRING(@token, 1, LEN(N'ESCAPE_NONE('))) and            (N'ESCAPE_SQUOTE(' != SUBSTRING(@token, 1, LEN(N'ESCAPE_SQUOTE('))) and            (N'ESCAPE_DQUOTE(' != SUBSTRING(@token, 1, LEN(N'ESCAPE_DQUOTE('))) and            (N'ESCAPE_RBRACKET(' != SUBSTRING(@token, 1, LEN(N'ESCAPE_RBRACKET('))))        BEGIN            select @commands = STUFF(@commands, @idxTokenStart + LEN(@strVariableStart), @tokenLen, N'ESCAPE_NONE(' + @token + N')')        END        select @idxTokenStart = CHARINDEX(@strVariableStart, @commands, @idxTokenStart + 1)    END    return @commandsENDgoif exists (select * from sys.objects where name = N'sp_AddEscapeNoneToJobStepTokens' and type = 'P')    drop procedure sp_AddEscapeNoneToJobStepTokensgo-- This procedure allows you to update jobs so that bare tokens-- are prefaced with ESCAPE_NONE. By default, all jobs are updated.-- You can optionally specify @job_name, @job_id, or @owner_name-- to limit the jobs that will be affected.CREATE PROCEDURE sp_AddEscapeNoneToJobStepTokens(    @job_name nvarchar(128) = null,    @job_id uniqueidentifier = null,    @owner_name nvarchar(256) = null)AS  -- Find the jobs to update. These jobs must match all of the input  -- criteria, unless all of the inputs are null. In this case,   -- examine all jobs.  The jobs must also be jobs created locally,  -- such as sysjobs.originating_server_id = 0. These jobs should not be a job that we run  -- because another server told us to.  Furthermore, if the job  -- is local but it is meant to be run on a target server, we send an  -- update for the job.  declare @jobsToUpdate TABLE (job_id uniqueidentifier not null)    insert into @jobsToUpdate      select job_id      from sysjobs      where originating_server_id = 0 -- local jobs      and ((COALESCE(@job_name, sysjobs.name) = sysjobs.name) and           (COALESCE(@job_id, sysjobs.job_id) = sysjobs.job_id) and           (COALESCE(@owner_name, suser_sname(sysjobs.owner_sid)) = suser_sname(sysjobs.owner_sid)))    -- Now find the job steps to update, creating the new command by using  -- fn_PrefaceTokensWithEscapeNone.  declare @jobStepsToUpdate TABLE (job_id uniqueidentifier not null,                                    step_id int not null,                                    command_old nvarchar(max) null,                                    command_new nvarchar(max) null,                                   output_file_old nvarchar(max) null,                                    output_file_new nvarchar(max) null)    insert into @jobStepsToUpdate  (job_id, step_id, command_old, command_new, output_file_old, output_file_new)      select job_id, step_id, command, dbo.fn_PrefaceTokensWithEscapeNone(command), output_file_name, dbo.fn_PrefaceTokensWithEscapeNone(output_file_name)      from sysjobsteps      where sysjobsteps.job_id =       (select job_id        from @jobsToUpdate        where job_id = sysjobsteps.job_id)    -- Now we update the actual job step commands. We do this first before  -- we push out the updated jobs to the target servers so the  -- target servers actually get the updated version.  declare @updated_job_id uniqueidentifier  declare @updated_job_step_id int  declare @updated_job_step_command nvarchar(max)  declare @updated_job_step_output_file nvarchar(max)    declare job_steps_cursor CURSOR FOR      select job_id, step_id, command_new, output_file_new      from @jobStepsToUpdate      order by job_id, step_id    OPEN job_steps_cursor  FETCH NEXT from job_steps_cursor into @updated_job_id, @updated_job_step_id, @updated_job_step_command, @updated_job_step_output_file  WHILE (@@FETCH_STATUS <> -1)  BEGIN      IF (@@FETCH_STATUS <> -2)      BEGIN          EXEC sp_update_jobstep @job_id = @updated_job_id, @step_id = @updated_job_step_id, @command = @updated_job_step_command, @output_file_name = @updated_job_step_output_file      END      FETCH NEXT from job_steps_cursor into @updated_job_id, @updated_job_step_id, @updated_job_step_command, @updated_job_step_output_file  END    CLOSE job_steps_cursor  DEALLOCATE job_steps_cursor      -- For multiserver jobs, call the sp_post_msx_operation stored procedure to update  -- all the target servers. Note that the sp_post_msx_operation stored procedure is safe  -- to call because it verifies whether the job is really a multiserver job.  declare jobs_cursor CURSOR FOR      select job_id      from @jobsToUpdate    OPEN jobs_cursor  FETCH NEXT from jobs_cursor into @updated_job_id  WHILE (@@FETCH_STATUS <> -1)  BEGIN      IF (@@FETCH_STATUS <> -2)      BEGIN          EXEC sp_post_msx_operation @operation = 'UPDATE', @job_id = @updated_job_id      END      FETCH NEXT from jobs_cursor into @updated_job_id  END    CLOSE jobs_cursor  DEALLOCATE jobs_cursor  -- List the jobs that we ran on, including the previous command  -- text. We list all of the job steps, even the ones that we did not  -- update. Otherwise, a jumble of job steps from  -- different jobs run together and the output is not  -- useful.  select N'Warning - Jobs Updated' = N'The following job steps and job output file names were analyzed and potentially updated to add the ESCAPE_NONE macro before any job tokens that were not already escaped. Please review the modified job steps and replace ESCAPE_NONE with the correct escape macro.'    select suser_sname(jobs.owner_sid) as N'Job owner',          jobs.name as N'Job name',          jobs.job_id,          jobStepsUpdated.step_id,          N'Modified' = CASE WHEN jobStepsUpdated.command_new != jobStepsUpdated.command_old or jobStepsUpdated.output_file_new != jobStepsUpdated.output_file_old THEN 1 ELSE 0 END,         N'Command' = jobStepsUpdated.command_new,          N'Previous Command' = jobStepsUpdated.command_old,          N'Output file' = jobStepsUpdated.output_file_new,          N'Previous Output file' = jobStepsUpdated.output_file_old      from sysjobs as jobs, @jobsToUpdate as jobsUpdated, @jobStepsToUpdate as jobStepsUpdated      where jobsUpdated.job_id = jobs.job_id and jobsUpdated.job_id = jobStepsUpdated.job_id      order by 'Job name', jobStepsUpdated.step_idgo
После запуска сценария sp_AddEscapeNoneToJobStepTokens создается хранимая процедура. По умолчанию будет обновлять все задания, при выполнении этой хранимой процедуры без параметров. Если нужно обновить только определенных заданий, необходимо задать непустые значения по крайней мере один из следующих трех параметров:
  • @ job_name
  • @ job_id
  • @ Аргумент owner_name
Например можно использовать следующий синтаксис:
  • Обновление всех заданий:
    EXEC sp_AddEscapeNoneToJobStepTokens
  • Обновите задания, указав имя задания:
    EXEC sp_AddEscapeNoneToJobStepTokens 'MyJob'
  • Редактирование заданий, владельцами которых являются одного владельца:
    EXEC sp_AddEscapeNoneToJobStepTokens null,null,'JobOwner'
Этот сценарий добавляет ESCAPE_NONE макрос для всех шагов задания, содержащие маркеры. После запуска этого сценария, рекомендуем просмотреть шаги заданий, которые используют маркеры как можно скорее. Затем замените ESCAPE_NONE макрос с одним из управляющих макросов, которые соответствует контексту шага задания.

Примечание При работе в главном сервере (MSX) и целевой сервер (TSX) среде, необходимо запустить этот сценарий на главного сервера и целевого сервера, чтобы убедиться, что правильно обновлены главных заданий для целевого сервера.

Для получения дополнительных сведений об обновлении заданий используйте новый синтаксис и использование управляющих макросов для включить замену маркеров в шагах задания агента SQL Server, см. раздел «Использование маркеров в задание действия» в документации SQL Server 2005 (апрель 2006 г.) или более поздних версиях электронной документации по SQL Server 2005.
Статус
Корпорация Майкрософт подтверждает, что это проблема в продуктах Microsoft, перечисленных в разделе «Относится к».
Ссылки
Для получения дополнительных сведений об использовании маркеров в шагах заданий посетите следующий веб-узел Microsoft Developer Network (MSDN):

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 915845 — последний просмотр: 06/18/2011 18:36:00 — редакция: 4.0

  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • kbsql2005presp1fix kbprb kbexpertiseadvanced kbtshoot kbmt KB915845 KbMtru
Отзывы и предложения