Купите товар вместе с сохранением имени поставщика в SQL Server

Я использую 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

1 ответ

Пара вопросов:

  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
Другие вопросы по тегам