当前位置: 首页 > 知识库问答 >
问题:

需要在sql服务器存储过程的try catch块中产生错误的对象名称

宋安晏
2023-03-14

我创建了一个更新数据库结构的存储过程。在try/catch块中,如果发生错误,我可以获取ERROR_MESSAGE()值,但它没有指定错误发生的位置或对象。ERROR_NUMBER() 函数是无用的,因为行号偏离 ab 很多。

是否有任何方法来识别正在创建的对象或它失败的语句?下面是一个try catch块的小示例:

BEGIN TRY
BEGIN TRANSACTION 

ALTER TABLE [dbo].[Activity] WITH CHECK ADD CONSTRAINT [FK_dbo.Activity_dbo.Application_ApplicationId] FOREIGN KEY ([ApplicationId]) REFERENCES [dbo].[Application] ([ApplicationId]) ON DELETE CASCADE 
ALTER TABLE [dbo].[Activity] CHECK CONSTRAINT [FK_dbo.Activity_dbo.Application_ApplicationId] 

ALTER TABLE [dbo].[ApplicationCategory] WITH CHECK ADD CONSTRAINT [FK_ApplicationCategory_Application] FOREIGN KEY ([ApplicationId]) REFERENCES [dbo].[Application] ([ApplicationId]) 
ALTER TABLE [dbo].[ApplicationCategory] CHECK CONSTRAINT [FK_ApplicationCategory_Application] 

ALTER TABLE [dbo].[Contacts] WITH CHECK ADD CONSTRAINT [FK_Contacts_Product] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Product] ([ProductId]) 
ALTER TABLE [dbo].[Contacts] CHECK CONSTRAINT [FK_Contacts_Product] 

ALTER TABLE [dbo].[Frame] WITH CHECK ADD CONSTRAINT [FK_dbo.Frame_dbo.Product_ProductId] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Product] ([ProductId]) 
ALTER TABLE [dbo].[Frame] CHECK CONSTRAINT [FK_dbo.Frame_dbo.Product_ProductId] 

ALTER TABLE [dbo].[FramesMarkup] WITH CHECK ADD CONSTRAINT [FK_dbo.FramesMarkup_dbo.Manufacturer_ManufacturerId] FOREIGN KEY ([ManufacturerId]) REFERENCES [dbo].[Manufacturer] ([ManufacturerId]) 
ALTER TABLE [dbo].[FramesMarkup] CHECK CONSTRAINT [FK_dbo.FramesMarkup_dbo.Manufacturer_ManufacturerId] 

ALTER TABLE [dbo].[InventoryDecrement] WITH CHECK ADD CONSTRAINT [FK_dbo.InventoryDecrement_dbo.Inventory_InventoryId] FOREIGN KEY ([InventoryId]) REFERENCES [dbo].[Inventory] ([InventoryId]) 
ALTER TABLE [dbo].[InventoryDecrement] CHECK CONSTRAINT [FK_dbo.InventoryDecrement_dbo.Inventory_InventoryId] 

ALTER TABLE [dbo].[Lens] WITH CHECK ADD CONSTRAINT [FK_dbo.Lens_dbo.Rx_RxId] FOREIGN KEY ([RxId]) REFERENCES [dbo].[Rx] ([RxId]) ON DELETE CASCADE 
ALTER TABLE [dbo].[Lens] CHECK CONSTRAINT [FK_dbo.Lens_dbo.Rx_RxId] 

COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRANSACTION
END CATCH

错误消息是:<code>无法创建约束。请参阅以前的错误 我想知道哪个约束失败了。

共有3个答案

徐翔
2023-03-14

您可以在try块的开头添加@Step int=0变量。

并且对于每个约束递增它。然后在< code>catch块中输出它。

戚云
2023-03-14

我用来记录错误的错误函数有:error_number、error_ severity、error _state、error-line、error.procedure和error.message。

也就是说,如果您想知道失败的约束,我将为它创建一个参数,并在每个约束之前用约束名称更新它。然后在你的捕获中打印出来。

陶瀚玥
2023-03-14

函数ERROR_LINE()可能会对您有所帮助。它返回脚本错误发生的行号。只要脚本没有被不断编辑,导致行号四处移动,您就可以使用它。

 类似资料:
  • 我是MySQL存储过程的新手。不知道为什么我会出现以下错误。请帮我调试一下。 1064年的今天,您的SQL语法出现错误;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第3行的user_-username=@th'中使用near'作为该用户的id,该用户的全名 表名:user_master 用户id密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密

  • 我在SAP HANA中定义了一个存储过程,其中包含3个in参数,返回一个记录集。当我用语法调用它时,它在HANA studio中运行得非常好。 现在我需要从微软SQL服务器调用它(我在2016年)。我有一个与HANA服务器的远程链接服务器连接,当使用和语法查询表和视图时,它可以正常工作。 我尽力了,但找不到调用远程过程的方法。“CALL sp_name(p,p,p)”语法返回“对象没有列或当前用户

  • 问题内容: 我使用的是SQL Server2005。我创建了一个大多数时候都可以使用的存储过程,但是我发现了一个实例,它无法满足我的要求。 目前,代码执行的操作是这样的 输出变量在哪里。 因此,我可以得到一个数字,但我真正想要的只是SQL错误。 像 Hey之类的 东西 ,我不能这样做,因为在此列上有fk约束 或其他 约束 。我在msdn http://msdn.microsoft.com/zh-

  • 我已经尝试了StackOverflow上发布的所有解决方案,但我的问题没有在那里讨论,所以我提出了这个问题。在我的例子中,图像被上传到firebase存储桶中,但没有在firestore中插入新记录,因此发生了此错误。我的代码:- 存储数据函数如下所示:-

  • 如果不能理解我的英语是因为我的英语不好。。。。我会尽力解释我的问题。 我试图在mysql(phpmyadmin)中创建一个存储过程,但出现了以下错误: #1064年的今天,您的SQL语法出现错误;请查看与MySQL服务器版本对应的手册,以获取第3行“”附近使用的正确语法 这是存储过程的代码: 这是表格用户的代码: 对不起,我的英语不好

  • 我正在尝试使用SQL server上的链接服务器运行Oracle存储过程。 存储过程是,它接受参数。 在SQL Server中,我这样执行它: 我遇到了这个错误: 链接服务器“LServer”的OLE DB提供程序“OraOLEDB. Oracle”返回消息“ORA-06550:第1行,第47列: PLS-00201:必须声明标识符“2016-06-26” ORA-06550:第1行,第7列: P