【问题标题】:Purchase an item along with saving the name of Supplier in SQL Server购买商品并在 SQL Server 中保存供应商的名称
【发布时间】:2018-12-04 17:41:21
【问题描述】:

我使用的是 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

【问题讨论】:

  • 您面临很多问题?愿意分享吗?有语法错误吗?没有错误,但数据不正确?
  • 您不能像这样在插入语句中将存储过程粘贴到值列表中。而且您似乎在这里遇到了一些非常严重的架构问题。使用产品和/或供应商的名称来获取 ID 表明存在严重错误。这意味着您在这些列中不能有任何重复,这很奇怪。

标签: sql-server transactional dynamic-queries


【解决方案1】:

几个问题:

  1. 不能在值子句中使用存储过程输出。
  2. 为什么会有commit和rollback
  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

【讨论】:

  • 输入此查询后收到以下错误:INSERT 语句与 FOREIGN KEY 约束“FK_Purchase_Product”冲突。冲突发生在数据库“GeneralStoreManagement”、表“dbo.Product”、列“Product_id”中。
  • 我正在使用 SQL Server 数据库进行一般商店管理,spGetProductId 正在返回一个整数,该整数是该产品的 id 以输入到购买表中。现在请记住,我正在将产品输入到产品表中,并将在此交易中输入的产品的 ID 放在购买表中。这就是为什么它给我产品不存在的外键冲突。请尽快回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
相关资源
最近更新 更多