أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

فشل عامل ملقم SQL مهام عندما يتضمن المهام الخطوات مهمة استخدام الرموز المميزة بعد تثبيت SQL Server 2005 المزود بحزمة الخدمة Service Pack 1

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

915845
الخطأ رقم: 426808 (SQLBUDT)
الأعراض
بعد تثبيت Microsoft SQL Server 2005 المزود بحزمة الخدمة Service Pack 1 (SP1) تواجه السلوك التالي:
  • فشل عامل ملقم SQL مهام عندما يتضمن المهام الخطوات مهمة استخدام الرموز المميزة.
  • تظهر رسالة الخطأ التالية:
    تحتوي الخطوة مهمة على الرموز المميزة واحد أو أكثر. للحصول على SQL Server 2005 المزود بحزمة الخدمة Service Pack 1 أو الإصدارات الأحدث كافة الخطوات مهمة مع الرموز المميزة يجب تحديث باستخدام ماكرو قبل أن يمكن تشغيل المهمة.
ملاحظة تحدث هذه المشكلة مع بنية 2046 أو أحدث إصدارات SQL Server 2005.
السبب
في SQL Server 2005 المزود بحزمة الخدمة SP1 ، تم تغيير بناء الرمز المميز خطوة مهمة عامل ملقم SQL. الآن، يجب عليك تضمين على ماكرو هروب مع كافة الرموز المميزة التي يتم استخدامها في الخطوات مهمة. إذا لم تقم بتضمين على ماكرو هروب ستفشل تلك الخطوات مهمة. يسرد الجدول التالي وحدات الماكرو الهروب.
الماكرو الهروبوصف
$ (ESCAPE_SQUOTE (TokenName))هذا الماكرو escapes apostrophes (') في سلسلة استبدال الرمز المميز. استبدال الماكرو علامة اقتباس أحادية واحد apostrophes اثنين.
$ (ESCAPE_DQUOTE (TokenName))هذا الماكرو escapes علامات الاقتباس ('') في سلسلة استبدال الرمز المميز. استبدال الماكرو علامة اقتباس واحد علامتي اقتباس.
$ (ESCAPE_RBRACKET (TokenName))هذا الماكرو escapes أقواس الأيمن (]) في سلسلة استبدال الرمز المميز. استبدال الماكرو أيمن واحد بين أقواس الأيمن.
$ (ESCAPE_NONE (TokenName))استبدال الماكرو رمز مميز بدون escaping أية أحرف في السلسلة. يتم توفير هذا الماكرو لدعم بالتوافق مع الإصدارات السابقة في بيئات حيث يتم فقط المتوقعة سلاسل استبدال الرمز المميز من مستخدمين موثوق بهم.
على سبيل المثال، قد يحتوي خطوة مهمة على عبارة SQL للعمليات التالية التي تستخدم الرمز المميز DBN A:
CREATE DATABASE [$(A-DBN)]
في هذا المثال يجب عليك تحديث بناء الجملة الرمز المميز إلى بناء الجملة التالي:
CREATE DATABASE [$(ESCAPE_RBRACKET(A-DBN))]
هذا التغيير يختلف عن سلوك SQL Server 2005 السابقة حيث وحدات الماكرو هروب غير المطلوبة.
الحل
لحل هذه المشكلة، قم بتحديث كافة إما أو مهام معينة فقط التي تستخدم الرموز المميزة إلى بناء جملة الرمز المميز جديد. للقيام بذلك، استخدم الإجراء sp_AddEscapeNoneToJobStepTokens تخزين. يمكنك إنشاء هذا الإجراء المخزن باستخدام البرنامج النصي Transact-SQL التالي.

ملاحظة تأكد من أن بناء SQL Server 2005 المزود بحزمة الخدمة SP1 الذي تقوم بتثبيته بناء 2046 أو بنية لاحقة. بالإضافة إلى ذلك، يجب أن تكون عضواً دور مسؤول النظام الملقم ثابت لتشغيل script.
      -- 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) الهدف يجب تشغيل هذا البرنامج النصي على كل من MSX في TSX للتأكد من تحديث مهام رئيسية على TSX بشكل صحيح.

للحصول على مزيد من المعلومات حول كيفية تحديث مهام إلى استخدم بناء الجملة الجديدة وكيفية استخدام وحدات الماكرو الهروب لتمكين استبدال الرمز المميز في خطوات مهمة عامل ملقم SQL راجع الموضوع "استخدام الرموز المميزة في خطوات المهمة" في SQL Server 2005 المباشرة (أبريل ٢٠٠٦) أو الإصدارات الأحدث من SQL Server 2005 المباشرة.
تصريح
أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "تنطبق على".
مراجع
للحصول على مزيد من المعلومات حول كيفية استخدام الرموز المميزة في خطوات مهمة قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:

تحذير: تمت ترجمة هذا المقال تلقائياً

خصائص

رقم الموضوع: 915845 - آخر مراجعة: 05/24/2006 16:37:19 - المراجعة: 2.1

  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • kbmt kbsql2005presp1fix kbprb kbexpertiseadvanced kbtshoot KB915845 KbMtar
تعليقات