-1

我正在使用 SQL Server 2014,我在其中设计了数据库以用于一般商店管理。

我必须输入项目及其供应商名称、库存和项目名称。为此,我必须执行三个语句,这就是我使用事务选项的原因,因为如果在执行过程中出现任何类型的问题,我需要再次回滚。这是我一直面临许多问题的 SQL。

这是我尝试运行的 SQL 代码:

BEGIN TRANSACTION AddItem

INSERT INTO Product(Name, Stock, Type_Id, Pur_Price, Sale_Price)
VALUES ('Lemon', 20, 2, 129, 325);

INSERT INTO Supplier(Name, Contact_No)
VALUES ('Kamran', '034637827');

INSERT INTO Purchase(Product_id, Supplier_Id, Quantity)
VALUES(EXEC spGetProductId @Name= 'Lemon', EXEC spGetSupplierId @Name='Kamran', 20);

COMMIT AddItem
ROLLBACK
4

1 回答 1

0

几个问题:

  1. 不能在值子句中使用存储过程输出。
  2. 为什么你有提交和回滚
  3. 您是从 SSMS、某些 C# 应用程序等执行此操作吗?
  4. sp_getproductid 返回结果集或返回值是什么?

也许这样的东西适用于 SSMS,或者如果你打算用它制作一个存储过程

    BEGIN TRY
        BEGIN TRANSACTION 

            INSERT INTO Product(Name, Stock, Type_Id, Pur_Price, Sale_Price)
            VALUES ('Lemon', 20, 2, 129, 325);

            INSERT INTO Supplier(Name, Contact_No)
            VALUES ('Kamran', '034637827');

            DECLARE @prodid int
            EXEC @prodid = spGetProductId @Name= 'Lemon'

            DECLARE @SupplierID int
            EXEC @SupplierID = spGetSupplierId @Name='Kamran'

            INSERT INTO Purchase(Product_id, Supplier_Id, Quantity)
            VALUES(@prodid , @SupplierID, 20);

        COMMIT
    END TRY
    BEGIN CATCH
        DECLARE @ErrCode        INT = 0,
                @ErrMsg         VARCHAR(4000) = '',
                @CRLF           CHAR(2) = CHAR(13) + CHAR(10)

        SET @ErrCode = @@ERROR;
        SET @ErrMsg = ERROR_MESSAGE();

        IF XACT_STATE() = -1
            ROLLBACK TRANSACTION;
        ELSE IF @@TRANCOUNT = 1 
            ROLLBACK TRANSACTION;
        ELSE IF @@TRANCOUNT > 1 AND XACT_STATE() = 1 
            COMMIT;

        RAISERROR(@ErrMsg, 16, 1);
    END CATCH
于 2018-12-04T17:56:55.527 回答