Bagaimana saya bisa mendapatkan nomor baris prosedur tersimpan yang sebenarnya dari pesan kesalahan?

110

Ketika saya menggunakan SQL Server dan ada kesalahan, pesan kesalahan memberikan nomor baris yang tidak berkorelasi dengan nomor baris dalam prosedur tersimpan. Saya berasumsi bahwa perbedaannya adalah karena ruang kosong dan komentar, tetapi benarkah?

Bagaimana saya bisa menghubungkan kedua set nomor baris ini satu sama lain? Jika ada yang bisa memberi saya setidaknya petunjuk ke arah yang benar, saya akan sangat menghargainya.

Saya menggunakan SQL server 2005.

chama
sumber
1
Saya pikir nomor baris berhubungan dengan badan proc. yaitu mengabaikan header.
Martin Smith
Mungkin stackoverflow.com/questions/4550342/… akan membantu.
John Saunders
Di mana header berakhir? Setelah awal yang mengikuti prosedur perubahan ... AS?
chama
Sepertinya mulai menghitung dari create procgaris dalam pengujian saya. Saya berasumsi Anda melihat sesuatu yang berbeda.
Martin Smith
1
Dijelaskan dalam jawaban saya di sini: stackoverflow.com/questions/2947173/…
gbn

Jawaban:

113

IIRC, itu mulai menghitung baris dari awal batch yang membuat proc itu. Itu berarti permulaan skrip, atau pernyataan "GO" terakhir sebelum pernyataan create / alter proc.

Cara yang lebih mudah untuk melihatnya adalah dengan menarik teks sebenarnya yang digunakan SQL Server saat membuat objek. Alihkan output Anda ke mode teks (CTRL-T dengan pemetaan kunci default) dan jalankan

sp_helptext proc_name

Salin dan tempel hasil ke jendela skrip untuk mendapatkan penyorotan sintaks dll, dan gunakan fungsi garis goto (menurut saya CTRL-G) untuk membuka baris kesalahan yang dilaporkan.

Rick
sumber
14
Ketika saya melakukan ini dalam mode Grid-Output, itu juga menempelkan nomor baris
kode
2
@codeulike - Poin yang bagus, jika Anda menggunakan output Grid, nomor baris akan cocok dengan nomor baris, jadi Anda tidak perlu menggunakan CTRL + G. Satu-satunya masalah saya dengan keluaran Grid adalah ia mengubah karakter TAB menjadi satu SPASI, jadi Anda kehilangan semua pemformatan.
Rick
32

Di luar kebiasaan yang saya tempatkan LINENO 0langsung setelah BEGINdalam prosedur tersimpan saya. Ini mengatur ulang nomor baris - menjadi nol, dalam kasus ini. Kemudian tambahkan saja nomor baris yang dilaporkan oleh pesan kesalahan ke nomor baris di SSMS tempat Anda menulis LINENO 0dan bingo - Anda memiliki nomor baris kesalahan seperti yang ditunjukkan di jendela kueri.

Vorlic
sumber
4
Mengapa tidak menempatkan "LineNo X" di mana X = nomor baris Anda meletakkan pernyataan, sehingga secara otomatis ditambahkan ke nomor baris yang dilaporkan?
LarryBud
8

Jika Anda menggunakan Catch Block dan menggunakan RAISERROR () untuk validasi kode dalam Try Block, maka Error Line akan dilaporkan di mana Catch Block berada dan bukan di mana kesalahan sebenarnya terjadi. Saya menggunakannya seperti ini untuk menjernihkannya.

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
Edward
sumber
6

Sebenarnya ini Error_number()bekerja dengan sangat baik.

Fungsi ini mulai menghitung dari pernyataan GO (Pemisah Batch) terakhir, jadi jika Anda belum menggunakan spasi Go dan masih menunjukkan nomor baris yang salah - lalu tambahkan 7 ke dalamnya, seperti dalam prosedur tersimpan di baris nomor 7 pemisah batch digunakan secara otomatis. Jadi jika Anda menggunakan pilih Cast (Error_Number () + 7 sebagai Int) sebagai [Error_Number] - Anda akan mendapatkan jawaban yang diinginkan.

pengguna2294834
sumber
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.- apa maksudnya ini?
underscore_d
4

Dalam TSQL / Prosedur Tersimpan

Anda mungkin mendapatkan kesalahan seperti:

Msg 206, Level 16, Status 2, Prosedur myproc, Baris 177 [Batch Start Line 7]

Ini berarti error ada di baris 177 di batch. Bukan 177 di SQL. Anda harus melihat nomor baris batch Anda dimulai, dalam kasus saya [7], dan kemudian Anda menambahkan nilai itu ke nomor baris untuk menemukan pernyataan apa yang salah

jasttim
sumber
2

kamu bisa menggunakan ini

CAST(ERROR_LINE() AS VARCHAR(50))

dan jika Anda ingin membuat tabel log kesalahan Anda dapat menggunakan ini:

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())
HAJJAJ
sumber
4
Perhatikan bahwa ERROR_LINE () hanya tersedia di bagian CATCH dari TRY / CATCH dalam prosedur tersimpan. Nomor baris yang dilaporkan sama dengan yang dikembalikan SQL Server jika Anda tidak menemukan kesalahan. Jadi meskipun itu bisa berguna, itu tidak membantu menjawab pertanyaan ini.
Rick
1

Jawaban panjang: nomor baris dihitung dari CREATE PROCEDUREpernyataan, ditambah baris kosong atau baris komentar yang mungkin Anda miliki di atasnya ketika Anda benar-benar menjalankan CREATEpernyataan, tetapi tidak menghitung baris apa pun sebelum GOpernyataan…

Saya merasa jauh lebih mudah untuk membuat proc yang disimpan untuk dimainkan untuk mengonfirmasi:

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

Setelah Anda membuatnya, Anda dapat mengubahnya ALTER PROCEDUREdan menambahkan beberapa baris kosong di atas komentar dan di atas dan di bawah GOpernyataan pertama untuk melihat efeknya.

Satu hal yang sangat aneh yang saya perhatikan adalah bahwa saya harus menjalankan EXEC ErrorTestingdi jendela kueri baru alih-alih menyorotnya di bagian bawah jendela yang sama dan menjalankan ... Ketika saya melakukannya, nomor baris terus naik! Tidak yakin mengapa itu terjadi ..

Andy Raddatz
sumber
1

Anda bisa mendapatkan pesan kesalahan dan baris kesalahan di blok penangkap seperti ini:

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
Badiparmagi
sumber