当我使用SQL Server时出现错误,错误消息给出的行号与存储过程中的行号没有关联。我认为差异是由于空白和注释引起的,是真的吗?
如何将这两组线号相互关联?如果有人能够至少向我提供正确方向的指点,我将非常感激。
我正在使用SQL Server 2005。
create proc
在我的测试中,它似乎从线开始计算。我认为您看到的是不同的东西。
当我使用SQL Server时出现错误,错误消息给出的行号与存储过程中的行号没有关联。我认为差异是由于空白和注释引起的,是真的吗?
如何将这两组线号相互关联?如果有人能够至少向我提供正确方向的指点,我将非常感激。
我正在使用SQL Server 2005。
create proc
在我的测试中,它似乎从线开始计算。我认为您看到的是不同的东西。
Answers:
IIRC,它从创建该proc的批处理开始计数行数。这意味着要么是脚本的开始,要么是create / alter proc语句之前的最后一个“ GO”语句。
一种更简单的查看方法是提取创建对象时SQL Server使用的实际文本。将输出切换到文本模式(使用默认键映射的CTRL-T)并运行
sp_helptext proc_name
将结果复制粘贴到脚本窗口中以突出显示语法等,然后使用goto行功能(我认为是CTRL-G)转到报告的错误行。
出于习惯,我LINENO 0
直接将其BEGIN
放在存储过程中。在这种情况下,这会将行号重置为零。然后只需将错误消息报告的行号添加到您在其中编写LINENO 0
和宾果的SSMS中的行号即可-您具有查询窗口中表示的错误的行号。
如果您使用捕获块并在尝试块中使用RAISERROR()进行任何代码验证,则将报告错误行在捕获块所在的位置,而不是实际发生错误的位置。我用它来清除它。
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
实际上,这Error_number()
很好。
此函数从最后一个GO(批处理分隔符)语句开始计数,因此,如果您未使用任何Go空格并且它仍显示错误的行号-则向其添加7,如在存储过程中第7行的批处理分隔符自动使用。因此,如果使用选择Cast(Error_Number()+ 7作为Int)作为[Error_Number],则会得到所需的答案。
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.
-这是什么意思?
你可以用这个
CAST(ERROR_LINE() AS VARCHAR(50))
如果要创建错误日志表,则可以使用以下命令:
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())
长答案:行号是从CREATE PROCEDURE
语句中计算的,加上您实际运行该CREATE
语句时可能在其上方的任何空行或注释行,但不计算行号之前的任何行GO
语句 …
我发现制作一个存储的proc进行确认要容易得多:
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
创建ALTER PROCEDURE
完之后,您可以将其切换到并在注释上方以及第一个注释的上方和下方添加一些空白行。GO
语句以查看效果。
我注意到的一件非常奇怪的事情是,我必须EXEC ErrorTesting
在一个新的查询窗口中运行,而不是在同一窗口的底部高亮显示它并运行它……当我这样做时,行号一直在上升!不知道为什么会这样..