Oprava: Volání příkaz RAISERROR v dávce Transact-SQL může způsobit SQLAgent úloha nezdaří a ztratit výstup v SQL Server

Překlady článku Překlady článku
ID článku: 309802 - Produkty, které se vztahují k tomuto článku.
Důležité: Tento článek obsahuje informace o úpravě registru. Před úpravami je nutné registr zazálohovat. Seznamte se také s postupem obnovení registru v případě, že nastane problém. Další informace o zálohování, obnovení a úpravě registru naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
256986Popis registru systému Microsoft Windows
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při kroku typ SQLAgent úlohy je skript Transact-SQL a příkazy v poli příkaz nová úloha krok-< Název Instance Serveru SQL > dialogové okno pole volání příkaz Transact-SQL RAISERROR s závažnosti úrovně 11 nebo vyšší bez WITH LOG možnost úlohy bude končit výsledek se nezdařilo. Přestože všechny příkazy Transact-SQL spustit po příkaz RAISERROR volání spustí, je však potlačen veškerý výstup. Proto generován žádný výstup pro výkazy po RAISERROR spustí příkaz. To může způsobit skutečně nejasnostem o co se stalo s příkazy v úloze. Trasování SQL Profiler musí prohlédnout Pokud chcete zobrazit ve skutečnosti spuštěn. Další informace o trasování SQL Profiler naleznete v tématu "SQL Profiler" v SQL Server Books Online.

Řešení

Upozornění Při nesprávných úpravách registru pomocí Editoru registru nebo jiným způsobem může dojít k vážným problémům. Tyto problémy mohou vyžadovat přeinstalaci operačního systému. Společnost Microsoft nezaručuje, že tyto problémy bude možné vyřešit. Úpravy registru provádíte na vlastní nebezpečí.

Informace o aktualizaci Service Pack

Tento problém vyřešíte získat nejnovější aktualizaci service pack pro 2000 Microsoft SQL Server. Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
290211Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2000

Informace o opravě hotfix

Anglická verze této opravy hotfix má následující (nebo pozdější) atributy souborů. Data a časy jednotlivých souborů jsou uvedeny ve formátu UTC (Coordinated Universal Time). Pokud zobrazíte informace o souboru, bude převedena na místní čas. Rozdíl mezi místním ČASEM a najít, použijte kartu časové pásmo v ovládacím panelu Datum a čas.
   Date         Time   Version         Size       File name
   -------------------------------------------------------------------
   31-May-2003  05:15  2000.80.818.0      78,400  Console.exe
   27-Oct-2003  14:51  2000.80.873.0     315,968  Custtask.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Dbmslpcn.dll
   24-Apr-2003  12:42                    786,432  Distmdl.ldf
   24-Apr-2003  12:42                  2,359,296  Distmdl.mdf
   29-Jan-2003  12:25                        180  Drop_repl_hotfix.sql
   11-Sep-2003  13:56  2000.80.859.0   1,905,216  Dtspkg.dll
   26-Aug-2003  06:46  2000.80.854.0     528,960  Dtspump.dll
   23-Jun-2003  09:10  2000.80.837.0   1,557,052  Dtsui.dll
   23-Jun-2003  09:10  2000.80.837.0     639,552  Dtswiz.dll
   23-Apr-2003  13:21                    747,927  Instdist.sql
   02-May-2003  12:26                      1,581  Inst_repl_hotfix.sql
   30-Jan-2004  02:59  2000.80.911.0      90,692  Msgprox.dll
   31-Mar-2003  12:37                      1,873  Odsole.sql
   30-Jan-2004  02:59  2000.80.911.0      62,024  Odsole70.dll
   30-Jan-2004  02:59  2000.80.911.0      25,144  Opends60.dll
   30-Jan-2004  02:59  2000.80.911.0      57,904  Osql.exe
   02-Apr-2003  09:45  2000.80.797.0     279,104  Pfutil80.dll
   04-Aug-2003  04:47                    550,780  Procsyst.sql
   11-Sep-2003  11:07                     12,305  Qfe469315.sql
   22-May-2003  09:27                     19,195  Qfe469571.sql
   29-Jan-2004  11:47                  1,090,380  Replmerg.sql
   30-Jan-2004  02:59  2000.80.911.0     221,768  Replprov.dll
   30-Jan-2004  02:59  2000.80.911.0     307,784  Replrec.dll
   29-Jan-2004  09:54  2000.80.911.0     159,813  Replres.rll
   05-Sep-2003  10:30                  1,087,150  Replsys.sql
   13-Aug-2003  02:58                    986,603  Repltran.sql
   30-Jan-2004  02:59  2000.80.911.0     287,304  Rinitcom.dll
   30-Jan-2004  02:59  2000.80.911.0      57,916  Semnt.dll
   29-Jul-2003  06:43  2000.80.819.0     492,096  Semobj.dll
   31-May-2003  04:57  2000.80.818.0     172,032  Semobj.rll
   02-Jan-2004  06:12  2000.80.904.0      53,832  Snapshot.exe
   09-Dec-2003  06:37                    117,834  Sp3_serv_uni.sql
   04-Feb-2004  11:16  2000.80.913.0      28,672  Sqlagent.dll
   04-Feb-2004  11:17  2000.80.913.0     311,872  Sqlagent.exe
   07-Jan-2004  09:08  2000.80.905.0     126,976  Sqlakw32.dll
   30-Jan-2004  02:59  2000.80.911.0   4,215,360  Sqldmo.dll
   07-Apr-2003  04:14                     25,172  Sqldumper.exe
   29-Jan-2004  09:47  2000.80.911.0      28,672  Sqlevn70.rll
   30-Jan-2004  02:59  2000.80.911.0     180,792  Sqlmap70.dll
   02-Sep-2003  13:26  2000.80.857.0     188,992  Sqlmmc.dll
   02-Sep-2003  09:33  2000.80.857.0     479,232  Sqlmmc.rll
   21-Oct-2003  10:38  2000.80.871.0     401,984  Sqlqry.dll
   30-Jan-2004  02:59  2000.80.911.0      57,920  Sqlrepss.dll
   04-Feb-2004  11:18  2000.80.913.0   7,610,449  Sqlservr.exe
   30-Jan-2004  02:59  2000.80.911.0     590,396  Sqlsort.dll
   30-Jan-2004  02:59  2000.80.911.0      45,644  Sqlvdi.dll
   30-Jan-2004  02:59  2000.80.911.0     106,588  Sqsrvres.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Ssmslpcn.dll
   30-Jan-2004  02:59  2000.80.911.0      82,492  Ssnetlib.dll
   30-Jan-2004  02:59  2000.80.911.0      25,148  Ssnmpn70.dll
   27-Oct-2003  14:51  2000.80.873.0     123,456  Stardds.dll
   30-Jan-2004  02:59  2000.80.911.0     158,240  Svrnetcn.dll
   30-Jan-2004  02:59  2000.80.911.0      76,416  Svrnetcn.exe
   30-Apr-2003  10:22  2000.80.816.0      45,132  Ums.dll     
   30-Jan-2004  02:59  2000.80.911.0      98,872  Xpweb70.dll
Poznámka: Vzhledem k závislostem souborů může nejnovější oprava hotfix nebo funkce, která obsahuje tyto soubory také obsahovat další soubory.

Po použití této opravy hotfix je SQL Server Agent chování definovány registru novou hodnotu DWORD, které se nazývá TruncateJobResultOnError v následujících podklíčích registru:
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SQLServerAgent (default instance)
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\SQLServerAgent (named instance)
Chcete-li povolit nové chování, nastavte tuto hodnotu TruncateJobResultOnError 0. Po restartování SQL Server Agent výsledky úlohy bude již zkrácen podle raiserror výkazů. Pokud chcete obnovit starší chování, můžete nastavit TruncateJobResultOnError hodnotu 1. Toto je výchozí hodnota, pokud není nastavena hodnota.

Upozornění Změnit hodnotu na 0 nemusí být efektivní přístup, pokud skript, který má nekonečnou smyčku s právě vyvolána chyba. Agent nepřetržitě protokoluje chyby a může používat všechny místa na disku.

Jak potíže obejít

Problém můžete obejít pomocí jedné z následujících metod podle svých požadavků.

Metoda 1

Určit jaké úrovni závažnosti, kterou chcete použít
  • Pokud chcete volat příkaz RAISERROR pro informační účely, musíte použít úroveň závažnosti 10 pro chybovou zprávu. Stupeň závažnosti 10 představuje informační zpráva, která označuje, že došlo k potížím protože uživatel zadány nesprávné informace.
  • Chcete přerušit při volání příkaz RAISERROR dávky, musíte použít úroveň závažnosti 20 nebo vyšší pro chybovou zprávu a možnost WITH LOG s příkaz RAISERROR musí zahrnovat. Pokud tak učiníte, všechny příkazy Transact-SQL byly měl spustit po přerušena volání příkaz RAISERROR a otevřené transakce jsou automaticky vrácena zpět.

    Další informace o úrovních závažnosti naleznete v tématu "Error Message závažnosti úrovně" v SQL Server Books Online.

Metoda 2

Použít soubor skriptu v kroku úlohy
Pokud chcete celý skript spustit bez ohledu na to, jak často se nazývá příkaz RAISERROR a úroveň závažnosti je menší než 20, můžete použít soubor skriptu v kroku úlohy. Použijte uvedený postup:
  1. Uložte skript do souboru.
  2. Vytvořit úlohu SQL Server Agent s krok CmdExec úlohy a spustit soubor skriptu v kroku.

    Zde je příklad:
    osql -E -i c:\script.sql
Při použití souboru skriptu obdržíte stejného výsledku, pokud dávkové spuštění pomocí nástroje osql, které obdržíte, pokud dávky spustit pomocí SQL Query Analyzer.

Příkaz RAISERROR s úrovní závažnosti 20 nebo vyšší možnost WITH LOG volání způsobí připojení zavřete a příkazy, které byly měl spustit po volání RAISERROR jsou vynechány.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt. Tento problém byl poprvé opraven v Microsoft SQL Server 2000 Service Pack 4.

Další informace

Pokud je úroveň závažnosti chybová zpráva v kroku úlohy SQL Server Agent příkaz RAISERROR 2 až 9, úlohy a úlohy kroku end s výsledkem se nezdařilo. Výstup však nebudou potlačeny pro výkazy spustit po příkaz RAISERROR v dávce.

Pokud úrovně závažnosti chyby zpráv v RAISERROR prohlášení je 10, 1 nebo 0, úlohu a krok úlohy úspěšně spuštěna. Potíže uvedené v tomto článku v části "Příznaky" proto nedojde.

Ačkoli úlohy SQL Server Agent nezdaří, pokud spustíte skript stejné SQL pomocí SQL Query Analyzer, nástroje isql nebo nástroje osql, obdržíte výsledek očekáváte.

Kroky pro reprodukci tohoto chování

  1. Vytvořit novou úlohu SQL Server Agent s krok úlohy Skriptů Transact-SQL (TSQL)
  2. Type or Paste the following Transact-SQL Statement in the Command box.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 10', 10, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  3. Na kartě Upřesnit v části Možnosti příkazu Transact-SQL Script (TSQL) zadejte do pole výstupního souboruC:\Raiserror.log.
  4. Klepnutím vyberte možnost připojit.
  5. Klepněte na tlačítko použít a potom klepněte na tlačítko OK.
  6. Klepněte na tlačítko použít a potom klepněte na tlačítko OK.
  7. V programu SQL Server Enterprise Manager klepněte pravým tlačítkem myši na úlohu, SQL Server Agent, která byla vytvořena a klepněte na možnost Spustit úlohu.
  8. Spustit trasování SQL Profiler.
  9. For the same SQL Server Agent Job Step, Change the severity Level to 11 by replacing the Command in the Job Step As follows.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 11', 11, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  10. Úlohu znovu spustit.
Zde je výsledek generován v souboru raiserror.log.
Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:48:59

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Test raiserror with severity 10 [SQLSTATE 01000]
id          Table Name  
----------- ------------
1           sysobjects
2           sysindexes
3           syscolumns

(3 rows(s) affected)

Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:49:17

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Msg 50000, Sev 11: Test raiserror with severity 11 [SQLSTATE 42000]

V tomto souboru raiserror.log uvidíte, že s úrovní závažnosti 10 výstup z úlohy byl vytištěn v výstupní soubor a úloha měla úspěšný výsledek.

V tomto souboru raiserror.log uvidíte, že s úrovní závažnosti 11, výstup z první dva příkazy byla vytištěna do výstupního souboru a úloha měla výsledek se nezdařilo. RAISERROR zprávy je také ve formátu zprávy chyby namísto ve formátu informační úrovni závažnosti 10. Soubor trasování zobrazuje všechny příkazy proběhl úspěšně.

Změna úrovně závažnosti je číslo od 2 až 9 výstup není potlačen a výsledek úlohy se nezdaří v kroku a úlohy. Formát zprávy bude stejný jako formát zprávy Chyba pro úroveň závažnosti 11 nebo vyšší.

Vlastnosti

ID článku: 309802 - Poslední aktualizace: 2. listopadu 2007 - Revize: 5.5
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Klíčová slova: 
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:309802

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com