Bir hata mesajından gerçek saklı yordam satır numarasını nasıl alabilirim?


112

SQL Server'ı kullandığımda ve bir hata oluştuğunda, hata iletisi, saklı yordamdaki satır numaralarıyla ilişkisi olmayan bir satır numarası veriyor. Farkın boşluktan ve yorumlardan kaynaklandığını varsayıyorum, ama gerçekten mi?

Bu iki satır numarası kümesini birbiriyle nasıl ilişkilendirebilirim? Biri bana en azından doğru yönde bir işaret verebilirse, gerçekten minnettar olurum.

SQL server 2005 kullanıyorum.


1
Satır numarasının, proc gövdesi ile ilgili olduğunu düşünüyorum. yani başlığı yok sayın.
Martin Smith


Başlık nerede bitiyor? Başladıktan sonra değiştirme prosedürünü izleyen ... AS?
chama

Testimdeki create procsatırdan saymaya başlamış gibiydi . Farklı bir şey gördüğünüzü varsayıyorum.
Martin Smith

Yanıtlar:


114

IIRC, satırları o proc'u oluşturan partinin başlangıcından itibaren saymaya başlar. Bu, ya komut dosyasının başlangıcı ya da proc ifadesinden önceki son "GO" ifadesi anlamına gelir.

Bunu görmenin daha kolay bir yolu, nesneyi oluştururken SQL Server'ın kullandığı gerçek metni çekmektir. Çıktınızı metin moduna (varsayılan tuş eşlemeleriyle CTRL-T) geçirin ve çalıştırın

sp_helptext proc_name

Sözdizimi vurgulaması vb. Almak için sonuçları bir komut dosyası penceresine kopyalayın ve bildirilen hata satırına gitmek için goto line işlevini (CTRL-G düşünüyorum) kullanın.


14
Bunu Izgara-Çıktı modunda yaptığımda, satır numaralarını da
yapıştırdı

2
@codeulike - İyi bir nokta, Grid çıktısını kullanırsanız, satır numarası satır numarasıyla eşleşir, bu nedenle CTRL + G kullanmanıza gerek yoktur. Grid çıktısıyla ilgili tek sorunum, SEKME karakterlerini tek bir SPACE olarak değiştirmesi, böylece tüm biçimlendirmeyi kaybedersiniz.
Rick

33

Alışkanlık dışında, LINENO 0doğrudan BEGINsaklanan prosedürlerime yerleştiririm. Bu, satır numarasını sıfırlar - bu durumda sıfıra. Ardından, hata mesajıyla bildirilen satır numarasını yazdığınız LINENO 0ve tombala yaptığınız SSMS'deki satır numarasına ekleyin - sorgu penceresinde gösterildiği gibi hatanın satır numarasına sahipsiniz.


4
Neden "SatırNo X" burada X = ifadeyi koyduğunuz satır numarası, böylece bildirilen satır numarasına otomatik olarak eklenmiyor?
LarryBud

8

Bir Yakalama Bloğu kullanırsanız ve Try Bloğu içinde herhangi bir kod doğrulaması için bir RAISERROR () kullandıysanız, Hata Satırı, Gerçek hatanın meydana geldiği yerde değil, Yakalama Bloğunun olduğu yerde rapor edilir. Bunu temizlemek için böyle kullandım.

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

Aslında bu Error_number()çok iyi çalışıyor.

Bu işlev, sayımları son GO (Toplu İş Ayırıcı) ifadesinden başlatır, bu nedenle herhangi bir Git boşluğu kullanmadıysanız ve hala yanlış bir satır numarası gösteriyorsa - sonra buna 7 ekleyin, çünkü 7 numaralı satırdaki saklı yordamda toplu iş ayırıcısı otomatik olarak kullanılır. Dolayısıyla, Yayınla (Hata_Numarası () + 7'yi Int olarak) [Hata_Numarası] olarak seçerseniz, istediğiniz yanıtı alırsınız.


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.- bu ne anlama geliyordu?
underscore_d

4

TSQL / Depolanan Prosedürlerde

Aşağıdaki gibi bir hata alabilirsiniz:

Msg 206, Düzey 16, Durum 2, Prosedür myproc, Satır 177 [Toplu Başlangıç ​​Satırı 7]

Bu, hatanın partide 177. satırda olduğu anlamına gelir. SQL'de 177 değil. Benim durumumda [7], partinizin hangi satır numarasında başladığını görmelisiniz ve sonra hangi ifadenin yanlış olduğunu bulmak için bu değeri satır numarasına eklersiniz.


2

bunu kullanabilirsin

CAST(ERROR_LINE() AS VARCHAR(50))

ve eğer hata günlüğü tablosu yapmak istiyorsanız, bunu kullanabilirsiniz:

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
ERROR_LINE () 'ın yalnızca saklı yordam içindeki bir TRY / CATCH'nin CATCH bölümünde kullanılabilir olduğunu unutmayın. Rapor ettiği satır numarası, hatayı yakalamazsanız SQL Server'ın döndürdüğü numarayla aynıdır. Bu yararlı olsa da, bu sorunun çözülmesine yardımcı olmaz.
Rick

1

Uzun cevap: satır numarası CREATE PROCEDUREifadeden sayılır , artı ifadeyi gerçekten çalıştırdığınızda üzerinde sahip olabileceğiniz boş satırlar veya yorum satırları CREATE, ancak GOifadeden önceki satırları saymaz ...

Depolanan bir işlemcinin onaylamak için oynamasını çok daha kolay buldum:

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

Oluşturduktan sonra , etkisini görmek için ALTER PROCEDUREyorumların üstüne ve ilk GOifadenin üstüne ve altına boş satırlar ekleyebilir ve ekleyebilirsiniz .

Fark ettiğim çok garip bir şey EXEC ErrorTesting, aynı pencerenin altında vurgulayıp koşmak yerine yeni bir sorgu penceresinde çalıştırmam gerektiğiydi ... Bunu yaptığımda satır numaraları artmaya devam etti! Bunun neden olduğundan emin değilim ..


1

catch bloğunda şu şekilde hata mesajı ve hata satırı alabilirsiniz:

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.