FIX: Una chiamata a un'istruzione RAISERROR in un batch Transact-SQL pu˛ causare un processo SQLAgent di esito negativo e di perdere l'output in SQL Server

Traduzione articoli Traduzione articoli
Identificativo articolo: 309802 - Visualizza i prodotti a cui si riferisce l?articolo.
importante Vengono fornite informazioni su come modificare il Registro di sistema. Assicurarsi di backup del Registro di sistema prima di modificarlo. Verificare che come ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni su come eseguire il backup, ripristinare e modificare il Registro di sistema, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
256986Descrizione del Registro di sistema di Microsoft Windows
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando un tipo di passaggio di processo SQLAgent Ŕ script Transact-SQL e le istruzioni nel campo comando di nuovo passaggio-< Nome Istanza di SQL Server > finestra di dialogo casella chiamata un'istruzione di RAISERROR di Transact-SQL con gravitÓ uguale o superiore senza l'opzione WITH LOG a livello di 11, il processo terminerÓ con risultato non riuscito. Tuttavia, sebbene tutte le istruzioni Transact-SQL vengono eseguite dopo l'istruzione RAISERROR chiamare viene eseguita, viene eliminato tutto l'output. Di conseguenza, non viene generato alcun output per le istruzioni dopo l'istruzione RAISERROR viene eseguito di istruzione. Questo veramente pu˛ causare confusione su dove si trovano le istruzioni in un processo. Se si desidera vedere ci˛ che effettivamente eseguito, Ŕ necessario esaminare una traccia SQL Profiler. Per ulteriori informazioni su una traccia SQL Profiler, vedere l'argomento di "SQL Profiler" nella documentazione in linea di SQL Server.

Risoluzione

avviso Pu˛ causare seri problemi se si modifica il Registro di sistema in modo errato mediante l'editor del Registro di sistema o utilizzando un altro metodo. Questi problemi potrebbero richiedere la reinstallazione del sistema operativo. Microsoft non garantisce che sia possono risolvere questi problemi. La modifica del Registro di sistema Ŕ a rischio e pericolo dell'utente.

Informazioni sul Service pack

Per risolvere il problema, ottenere il service pack pi¨ recente per Microsoft SQL Server 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211Come ottenere il service pack pi¨ recente per SQL Server 2000

Informazioni sull'hotfix

La versione di lingua inglese di questo aggiornamento rapido (hotfix) presenta gli attributi di file (o attributi successivi) elencati nella tabella riportata di seguito. Le date e le ore per questi file sono indicati in UTC (Coordinated Universal Time). Quando si visualizzano le informazioni sul file, viene convertito in ora locale. Per calcolare la differenza tra ora UTC e l'ora locale, utilizzare la scheda fuso orario dello strumento Data e ora del Pannello di controllo.
   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
Nota A causa delle dipendenze fra i file, la funzionalitÓ che contiene i file o l'aggiornamento rapido (hotfix) pi¨ recente pu˛ contenere anche ulteriori file.

Dopo avere applicato questo aggiornamento rapido (hotfix), comportamento di Agente SQL Server Ŕ definita da un nuovo valore DWORD chiamato TruncateJobResultOnError in una delle seguenti sottochiavi del Registro di sistema di registro:
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SQLServerAgent (default instance)
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\SQLServerAgent (named instance)
Per attivare il nuovo comportamento, impostare questo valore TruncateJobResultOnError su 0. Dopo aver riavviato agente SQL Server, i risultati del processo non verranno troncati da istruzioni raiserror . Per ripristinare il comportamento precedente, Ŕ possibile impostare il valore TruncateJobResultOnError su 1. Questo Ŕ il valore predefinito se non si imposta il valore.

avviso La modifica del valore su 0 non Ŕ un approccio efficace quando Ŕ presente uno script che dispone di un ciclo infinito con errore generata. Agente registra l'errore continuamente e pu˛ utilizzare tutto lo spazio su disco.

Workaround

Risolvere il problema, utilizzare uno dei seguenti metodi, in base alle proprie esigenze.

Metodo 1

Determinare il livello di gravitÓ si desidera utilizzare
  • Se si desidera chiamare un'istruzione RAISERROR per scopi informativi, Ŕ necessario utilizzare un livello di gravitÓ pari a 10 per il messaggio di errore. Un livello di gravitÓ pari a 10 rappresenta un messaggio informativo che indica che si Ŕ verificato un problema perchÚ l'utente immesse informazioni non corrette.
  • Se si desidera interrompere il batch quando un'istruzione RAISERROR viene chiamata, Ŕ necessario utilizzare un livello di gravitÓ 20 o superiore per il messaggio di errore ed Ŕ necessario includere l'opzione WITH LOG con l'istruzione RAISERROR. Quando si esegue questa operazione, tutte le istruzioni Transact-SQL che ritenevano eseguire dopo la chiamata per l'istruzione RAISERROR vengono interrotte e tutti i le transazioni aperte automaticamente rollback.

    Per ulteriori informazioni sui livelli di gravitÓ, vedere l'argomento di "Livelli di gravitÓ del messaggio di errore" nella documentazione in linea di SQL Server.

Metodo 2

Utilizzare un file di script nel passaggio di processo
Se si desidera che l'intero script da eseguire indipendentemente dalla frequenza con cui viene chiamato l'istruzione RAISERROR e il livello di gravitÓ Ŕ inferiore a 20, Ŕ possibile utilizzare un file di script nel passaggio di processo. Per effettuare questa operazione, attenersi alla seguente procedura:
  1. Salvare lo script in un file.
  2. Creare un processo SQL Server Agent con un passaggio di processo CmdExec ed eseguire il file di script nel passaggio.

    Di seguito Ŕ riportato un esempio:
    osql -E -i c:\script.sql
Quando si utilizza un file di script, si riceverÓ lo stesso risultato se il batch viene eseguito utilizzando l'utilitÓ osql visualizzato se il batch viene eseguito utilizzando SQL Query Analyzer.

La chiamata di un'istruzione RAISERROR con livello di gravitÓ di 20 o superiore con l'opzione WITH LOG provoca la chiusura della connessione e tutte le istruzioni che ritenevano eseguire dopo la chiamata RAISERROR vengono ignorate.

Status

Microsoft ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a". Questo problema Ŕ stato innanzitutto corretto in SQL Server 2000 Service Pack 4.

Informazioni

Se il livello di gravitÓ del messaggio di errore nel passaggio di processo SQL Server Agent dell'istruzione RAISERROR Ŕ 2 a 9, il processo e il passaggio di processo vengono terminare con un risultato non riuscito. Tuttavia, l'output non viene eliminato per le istruzioni che vengono eseguite dopo l'istruzione RAISERROR nel batch.

Se il livello di gravitÓ dell'errore dei messaggi in RAISERROR l'istruzione Ŕ 10, 1 o 0, il processo e il passaggio di processo viene eseguito correttamente. Di conseguenza, non si verifica il problema menzionato nella sezione "Sintomi" di questo articolo.

Sebbene il processo di SQL Server Agent ha esito negativo se si esegue lo script SQL stesso utilizzando SQL Query Analyzer, l'utilitÓ isql o l'utilitÓ osql , verrÓ visualizzato il risultato desiderato.

Procedura per riprodurre il problema.

  1. Creare un nuovo processo SQL Server Agent con un passaggio di processo Transact-SQL Script (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. Nella scheda Avanzate , nella sezione Opzioni di comando di Script Transact-SQL (T-SQL) digitare C:\Raiserror.log nella casella file di output .
  4. Fare clic per selezionare l'opzione Aggiungi .
  5. Fare clic su Applica e quindi fare clic su OK .
  6. Fare clic su Applica e quindi fare clic su OK .
  7. In SQL Server Enterprise Manager, fare clic con il pulsante destro del mouse il processo di SQL Server Agent Ŕ stato creato e scegliere Avvia .
  8. Avviare SQL Profiler traccia.
  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. Eseguire nuovamente il processo.
Set di risultati generato nel file 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]

In questo file raiserror.log, si noterÓ che con un livello di gravitÓ pari a 10, tutto l'output dal processo Ŕ stato stampato nel file di output e il processo ha esito positivo.

In questo file raiserror.log, Ŕ possibile visualizzare con un livello di gravitÓ di 11, nel file di output Ŕ stata stampata solo l'output dalle prime due istruzioni che il processo ha un risultato non riuscito. Inoltre, il messaggio RAISERROR Ŕ in un formato di messaggio di errore anzichÚ in un formato di un livello di gravitÓ 10 informativo. Il file di traccia mostra che tutte le istruzioni Ŕ stata eseguita correttamente.

Se si modifica il livello di gravitÓ a un numero da 2 a 9, l'output non viene eliminato e il risultato del processo avrÓ esito negativo per il passaggio e per il processo. Il formato del messaggio verrÓ coincidere con il formato di messaggio di errore per livello di gravitÓ 11 o versione successiva.

ProprietÓ

Identificativo articolo: 309802 - Ultima modifica: venerdý 2 novembre 2007 - Revisione: 5.5
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 309802
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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