Sie können Try / Fang mit einem erzwungenen Fehler verwenden, da der Catch -Block die Zeilennummer zurückgeben kann, die der Fehler über die Funktion error_line () aufgetreten ist. Das vollständige Konstrukt, das zur Lesbarkeit formatiert ist, lautet:
BEGIN TRY
;THROW 50000, 'Line#', 1 -- all 3 values are arbitrary, but required
END TRY
BEGIN CATCH
SET @LineNumber = ERROR_LINE()
END CATCH
Um die Variable @linenumber so zu erhalten, dass sie sich mit der Zeilennummer, auf die sie eingestellt ist, können Sie dieses Konstrukt wie folgt auf eine einzelne Zeile reduzieren:
BEGIN TRY;THROW 50000,'',1;END TRY BEGIN CATCH;SET @Line=ERROR_LINE();END CATCH
Hier ist ein vollständiges Beispiel dafür:
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
Die für Proc 1 und Proc 2 zurückgegebenen Liniennummern betragen 12 bzw. 23, was für beide korrekt ist.
Bitte beachten Sie, dass der Wurfbefehl in SQL Server 2012 gestartet wurde. Wenn Sie SQL Server 2005, 2008 oder 2008 R2 verwenden, müssen Sie Raiserror () -Funktion anstelle von Wurf verwenden.