يمكنك استخدام Try / Catch مع وجود خطأ قسري حيث يمكن أن تقوم كتلة Catch بإرجاع رقم السطر الذي حدث فيه الخطأ عبر وظيفة Error_line (). البناء الكامل ، المنسق لقدرة على القراءة ، هو:
BEGIN TRY
;THROW 50000, 'Line#', 1 -- all 3 values are arbitrary, but required
END TRY
BEGIN CATCH
SET @LineNumber = ERROR_LINE()
END CATCH
الآن ، للحصول على متغير @linenumber للملء برقم السطر الذي يتم تعيينه عليه ، يمكنك تقليل هذا البناء إلى سطر واحد على النحو التالي:
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
فيما يلي مثال كامل على العمل:
SET ANSI_NULLS ON
SET NOCOUNT ON
GO
-- Line #1 (of current batch, not of the entire script if GOs are used)
DECLARE @CRLF NCHAR(2) = NCHAR(13) + NCHAR(10),
@SQL1 NVARCHAR(MAX) = '',
@SQL2 NVARCHAR(MAX) = '', -- Line #5
@Line INT = -1 -- default to an invalid line #
SET @SQL1 += N'/********************' + @CRLF
SET @SQL1 += N' *' + @CRLF
SET @SQL1 += N' * Test Auto-' + @CRLF -- Line #10
SET @SQL1 += N' * Generated Proc 1' + @CRLF
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
SET @SQL1 += N' * Line #:' + CONVERT(NVARCHAR(10), @Line) + @CRLF
SET @SQL1 += N' *' + @CRLF
SET @SQL1 += N' ********************/' + @CRLF -- Line #15
-- more code here
SET @SQL2 += N'/********************' + @CRLF
SET @SQL2 += N' *' + @CRLF -- Line #20
SET @SQL2 += N' * Test Auto-' + @CRLF
SET @SQL2 += N' * Generated Proc 2' + @CRLF
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
SET @SQL2 += N' * Line #:' + CONVERT(NVARCHAR(10), @Line) + @CRLF
SET @SQL2 += N' *' + @CRLF -- Line #25
SET @SQL2 += N' ********************/' + @CRLF
PRINT @SQL1
PRINT @SQL2
GO
أرقام الخط التي يتم إرجاعها لـ Proc 1 و Proc 2 هي 12 و 23 على التوالي ، وهو أمر صحيح لكليهما.
يرجى ملاحظة أن أمر الرمي الذي بدأ في SQL Server 2012. إذا كنت تستخدم SQL Server 2005 أو 2008 أو 2008 R2 ، فأنت بحاجة إلى استخدام وظيفة Raiserror () بدلاً من الرمي.