Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在存储过程中使用try-catch的正确方法是什么_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 在存储过程中使用try-catch的正确方法是什么

Sql server 在存储过程中使用try-catch的正确方法是什么,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在为学校做一个项目,在数据库中创建一系列用于添加、更新和删除的存储过程。我想使用try-catch和一个标志来告诉用户是否成功。我使用的是SQLServer2005,我已经有了基本的存储过程,但是我想添加它以使我的项目更好。我一直在关键字集附近收到一个SQL错误,语法不正确。 这是我的密码: CREATE PROCEDURE dbo.addCustomer -- Add the parameters for the stored procedure here @flag bit outpu

我正在为学校做一个项目,在数据库中创建一系列用于添加、更新和删除的存储过程。我想使用try-catch和一个标志来告诉用户是否成功。我使用的是SQLServer2005,我已经有了基本的存储过程,但是我想添加它以使我的项目更好。我一直在关键字集附近收到一个SQL错误,语法不正确。 这是我的密码:

CREATE PROCEDURE dbo.addCustomer 
-- Add the parameters for the stored procedure here
@flag bit output, --return 1 for success and 0 for fail
@Customer_ID varchar(50),
@sales_region varchar(50),
@Items_Recieved varchar(max),
@Hual_ID varchar(50)
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
INSERT into dbo.Customer(Customer_ID,Sales_region, Items_Recieved, Hual_ID)
values(@Customer_ID,@sales_region, @Items_Recieved, @Hual_ID  
set @flag=1;
IF @@TRANCOUNT>0
BEGIN commit TRANSACTION;
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT>0
BEGIN rollback TRANSACTION;
END

set @flag=0;
END CATCH
END

GO
有人能给我指出正确的方向吗?我肯定我犯了一些简单的错误,或者忘记了做一些事情。
谢谢。

您丢失了
set@flag=1
之前的insert语句中,它应该是
值(@Customer\u ID、@sales\u region、@Items\u received、@Hual\u ID)嘎!我现在明白了。有时我看代码太久,以至于找不到简单的错误。我想我在逻辑上做错了什么。谢谢.M.Ali如果我想使用ERROR_MESSAGE()来显示自定义消息,我可以在其中存储一个字符串,并最终将其浮动到客户端以在一个漂亮的包装器中显示吗?或者,这只是要在management studio控制台中显示的SQL错误消息?您可以使用SQL server内置消息的自定义错误消息,这完全取决于您,但请仔细查看我在解决方案中使用的逻辑,您仅在实际执行插入时才打开事务,即使在您输入
Try Block
之前,也无需打开事务,一旦打开事务,立即提交它无需检查打开的事务,如果Try block control中出现错误,将跳转到catch block,您需要检查打开的事务,并在任何事务打开时回滚,然后执行其他错误处理。哦,现在我明白您的意思了,谢谢。这确实更有意义。您的逻辑实际上是使用try-catch来捕获错误,因为在我执行插入操作之前,事务不会打开,因此使try-catch能够处理错误。很有帮助,我明白了。
CREATE PROCEDURE dbo.addCustomer 
-- Add the parameters for the stored procedure here
@flag bit output, --return 1 for success and 0 for fail
@Customer_ID varchar(50),
@sales_region varchar(50),
@Items_Recieved varchar(max),
@Hual_ID varchar(50)
AS
BEGIN
     SET NOCOUNT ON;               
 BEGIN TRY

    BEGIN TRANSACTION
        INSERT INTO dbo.Customer(Customer_ID,Sales_region, Items_Recieved, Hual_ID)
        VALUES(@Customer_ID,@sales_region, @Items_Recieved, @Hual_ID)  
    COMMIT TRANSACTION;

       SET @flag=1;
  END TRY

  BEGIN CATCH
      IF (@@TRANCOUNT > 0)
       BEGIN 
         ROLLBACK TRANSACTION;
       END

    SET @flag=0; 
     --  Utilise your other Error Functions to get detailed 
     -- Information about the Error, function like 
     --  ERROR_LINE(), ERROR_MESSAGE(), ERROR_NUMBER()....
  END CATCH

END
GO