Come posso ottenere il numero di riga della stored procedure effettiva da un messaggio di errore?


110

Quando utilizzo SQL Server e si verifica un errore, il messaggio di errore fornisce un numero di riga che non ha alcuna correlazione con i numeri di riga nella stored procedure. Presumo che la differenza sia dovuta a spazi bianchi e commenti, ma lo è davvero?

Come posso mettere in relazione queste due serie di numeri di riga tra loro? Se qualcuno potesse darmi almeno un'indicazione nella giusta direzione, lo apprezzerei davvero.

Sto usando SQL Server 2005.


1
Penso che il numero di riga si riferisca al corpo del proc. cioè ignora l'intestazione.
Martin Smith


Dove finisce l'intestazione? Dopo l'inizio che segue la procedura di modifica ... COME?
chama

Sembrava iniziare a contare dalla create proclinea nel mio test. Presumo tu stia vedendo qualcosa di diverso.
Martin Smith

1
Descritto nella mia risposta qui: stackoverflow.com/questions/2947173/…
gbn

Risposte:


113

IIRC, inizia a contare le righe dall'inizio del batch che ha creato quel proc. Ciò significa o l'inizio dello script, oppure l'ultima istruzione "GO" prima dell'istruzione create / alter proc.

Un modo più semplice per vederlo è estrarre il testo effettivo utilizzato da SQL Server durante la creazione dell'oggetto. Passa l'output in modalità testo (CTRL-T con le mappature dei tasti predefinite) ed esegui

sp_helptext proc_name

Copia incolla i risultati in una finestra di script per ottenere l'evidenziazione della sintassi, ecc., E usa la funzione goto line (CTRL-G credo) per andare alla riga di errore riportata.


14
Quando l'ho fatto in modalità Grid-Output, ho bloccato anche i numeri di riga
codeulike

2
@codeulike - Buon punto, se usi l'output Grid il numero di riga corrisponderà al numero di riga, quindi non è necessario usare CTRL + G. Il mio unico problema con l'output Grid è che cambia i caratteri TAB in un singolo SPAZIO, quindi perdi tutta la formattazione.
Rick

32

Per abitudine inserisco LINENO 0subito dopo BEGINnelle mie stored procedure. Questo reimposta il numero di riga - a zero, in questo caso. Quindi aggiungi il numero di riga riportato dal messaggio di errore al numero di riga in SSMS in cui hai scritto LINENO 0e bingo: hai il numero di riga dell'errore come rappresentato nella finestra della query.


4
Perché non mettere semplicemente "LineNo X" dove X = il numero di riga su cui hai inserito l'istruzione, in modo che venga automaticamente aggiunto al numero di riga riportato?
LarryBud

8

Se si utilizza un Catch Block e un RAISERROR () per qualsiasi convalida del codice all'interno del Try Block, la riga di errore viene segnalata dove si trova il Catch Block e non dove si è verificato l'errore reale. L'ho usato in questo modo per chiarirlo.

BEGIN CATCH
  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

  SELECT 
     @ErrorMessage = ERROR_MESSAGE() + ' occurred at Line_Number: ' + CAST(ERROR_LINE() AS VARCHAR(50)),
     @ErrorSeverity = ERROR_SEVERITY(),
     @ErrorState = ERROR_STATE();

  RAISERROR (@ErrorMessage, -- Message text.
     @ErrorSeverity, -- Severity.
     @ErrorState -- State.
  );

END CATCH

6

In realtà Error_number()funziona molto bene.

Questa funzione avvia i conteggi dall'ultima istruzione GO (Batch Separator), quindi se non hai utilizzato spazi Go e mostra ancora un numero di riga errato, aggiungi 7 ad esso, come nella procedura memorizzata nella riga numero 7 il separatore batch viene utilizzato automaticamente. Quindi, se usi Seleziona Cast (Error_Number () + 7 as Int) come [Error_Number], otterrai la risposta desiderata.


1
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.- cosa avrebbe dovuto significare?
underscore_d

4

In TSQL / stored procedure

Potresti ricevere un errore come:

Messaggio 206, livello 16, stato 2, procedura myproc, riga 177 [riga di inizio batch 7]

Ciò significa che l'errore si trova nella riga 177 del batch. Non 177 nell'SQL. Dovresti vedere su quale numero di riga inizia il tuo batch, nel mio caso [7], quindi aggiungere quel valore al numero di riga per trovare quale affermazione è sbagliata


2

puoi usare questo

CAST(ERROR_LINE() AS VARCHAR(50))

e se vuoi creare una tabella di registro degli errori puoi usare questo:

INSERT INTO dbo.tbname( Source, Message) VALUES ( ERROR_PROCEDURE(), '[ ERROR_SEVERITY : ' + CAST(ERROR_SEVERITY() AS VARCHAR(50)) + ' ] ' + '[ ERROR_STATE : ' + CAST(ERROR_STATE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_PROCEDURE : ' + CAST(ERROR_PROCEDURE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(50)) + ' ] ' +  '[ ERROR_LINE : ' + CAST(ERROR_LINE() AS VARCHAR(50)) + ' ] ' + ERROR_MESSAGE())

4
Notare che ERROR_LINE () è disponibile solo nella parte CATCH di un TRY / CATCH all'interno della stored procedure. Il numero di riga che riporta è lo stesso restituito da SQL Server se non si rileva l'errore. Quindi, sebbene possa essere utile, non aiuta a risolvere questa domanda.
Rick

1

La risposta lunga: il numero di riga viene contato CREATE PROCEDUREdall'istruzione, più eventuali righe vuote o righe di commento che potresti aver avuto sopra quando hai effettivamente eseguito l' CREATEistruzione, ma senza contare le righe prima di GOun'istruzione ...

Ho trovato molto più facile creare un proc memorizzato con cui giocare per confermare:

GO

-- =============================================
-- Author:          <Author,,Name>
-- Create date: <Create Date,,>
-- Description:     <Description,,>
-- =============================================
CREATE PROCEDURE ErrorTesting
       -- Add the parameters for the stored procedure here
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

       -- Insert statements for procedure here
       SELECT 1/0

END
GO

Dopo averlo creato, puoi passare a ALTER PROCEDUREe aggiungere alcune righe vuote sopra i commenti e sopra e sotto la prima GOaffermazione per vedere l'effetto.

Una cosa molto strana che ho notato è stata che dovevo eseguire EXEC ErrorTestinguna nuova finestra di query invece di evidenziarla nella parte inferiore della stessa finestra e correre ... Quando l'ho fatto, i numeri di riga hanno continuato a salire! Non so perché sia ​​successo ..


1

puoi ottenere un messaggio di errore e una riga di errore nel blocco catch come questo:

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.