#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть два оператора insert в моем SQL-запросе. однако он вставляет данные только для первого оператора. он не вставляет данные для второго оператора insert.
GO
/****** Object: StoredProcedure [dbo].[prAddUpdateOrderDetails] Script Date: 4/10/2019 12:49:24 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
Name : [prAddUpdateOrderDetails]
Parameters :
Descripton : This sp is to add and update Orders
Author : Saion Corp.
Sample Exec : DECLARE @p1 INT
DECLARE @p2 [dbo].[udtOrderDetails]
INSERT INTO @p2 VALUES(0,0,7,0,2,1,200.00,200.00,200.00,20.00,220.00,240.00,12,'01/01/2000','01/01/2000',200.00,0)
DECLARE @p3 [dbo].[udtOrderProductAttributes]
INSERT INTO @p3 VALUES(0,0,7,5,1,'Sites','5 Users',1,1,10,1,0,0,10)
DECLARE @p4 [dbo].[udtOrderPromotions]
INSERT INTO @p4 VALUES(0,0,7,5,1,'Sites','5 Users',1,1,10,1,0,0,10)
DECLARE @p5 [dbo].[udtOrderDetailPromotions]
INSERT INTO @p5 VALUES(0,0,7,5,1,'Sites','5 Users',1,1,10,1,0,0,10)
EXEC [prAddUpdateOrderDetails] @OrderID = 0
,@SegmentId = 2
,@OrganizationId INT
,@CreatedBy = 1
,@OrderNumber = ''
,@Amount = 24.0
,@AMB = true
,@TotalAmount = 36.00
,@AdditionalSalesReps = ''
,@AdditionalNotes = ''
,@PromotionAmt =45.00
,@Subscription = 'JSON'
,@OrderPhaseId = 1
,@OrderDetails = @p2
,@OrderProductAttributes = @p3
,@OrderPromotions = @p4
,@OrderDetailPromotions = @p5
,@NewOrderId = @p1 OUTPUT
SELECT @p1
Modified History :
*/
ALTER PROCEDURE [dbo].[prAddUpdateOrderDetails] @OrderID INT
,@BillTo VARCHAR(20)
,@ShipTo VARCHAR(20)
,@SegmentId INT
,@OrganizationId INT
,@CreatedBy INT
,@OrderNumber NVARCHAR(50)
,@CustomerName NVARCHAR(255)
,@Email NVARCHAR(255)
,@ContactNumber NVARCHAR(30)
,@Amount DECIMAL(18, 2)
,@AMB BIT
,@TotalAmount DECIMAL(18, 2)
,@AdditionalSalesReps NVARCHAR(MAX)
,@AdditionalNotes NVARCHAR(50)
,@PromotionAmt DECIMAL(18, 2)
,@Subscription NVARCHAR(MAX)
,@OrderPhaseId INT
,@OrderDetails udtOrderDetails READONLY
,@OrderProductAttributes udtOrderProductAttributes READONLY
,@OrderPromotions udtOrderPromotions READONLY
,@OrderDetailPromotions udtOrderDetailPromotions READONLY
,@NewOrderId INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ErrMsg NVARCHAR(4000)
DECLARE @ErrSeverity INT
DECLARE @Quantity INT
DECLARE @ProductId INT
DECLARE @ParentProductId INT
DECLARE @WeightedAmount DECIMAL(18, 2)
DECLARE @AttributeId INT
DECLARE @AttributeName NVARCHAR(MAX)
DECLARE @CustomerEntersQty BIT
DECLARE @AttributeQuantity INT
DECLARE @TotalRecords INT
DECLARE @CurrentRow INT
DECLARE @TempOrderDetails TABLE (
OrderId INT
,OrderDetailId INT
,ProductID INT
)
BEGIN TRANSACTION ShopCT_TRAN;
BEGIN TRY
-- Insert into Orders table
IF NOT EXISTS (
SELECT 1
FROM [dbo].[Orders]
WHERE OrderId = @OrderID
)
BEGIN
INSERT INTO [dbo].[Orders] (
[BillTo]
,[ShipTo]
,[SegmentId]
,[OrganizationId]
,[CreatedBy]
,[OrderNumber]
,[CustomerName]
,[Email]
,[ContactNumber]
,[Amount]
,[TotalAmount]
,[AdditionalSalesReps]
,[AdditionalNotes]
--,[OrderDate]
,[PromotionAmt]
,[Subscription]
,[OrderPhaseId]
,[AMB]
)
VALUES (
@BillTo
,@ShipTo
,@SegmentId
,@OrganizationId
,@CreatedBy
,@OrderNumber
,@CustomerName
,@Email
,@ContactNumber
,@Amount
,@TotalAmount
,@AdditionalSalesReps
,@AdditionalNotes
--,GETDATE()
,@PromotionAmt
,@Subscription
,@OrderPhaseId
,@AMB
);
SET @OrderId = CONVERT(INT, SCOPE_IDENTITY());
DECLARE @OPhaseId INT = (
SELECT OrderPhaseId
FROM OrderPhase
WHERE OrderPhase = 'Shopping Carts'
);
-- Order Processings entry when order created or shopping cart
INSERT INTO OrderProcessings (
[OrderId]
,[OrderPhase_Id]
,[CreatedBy]
)
VALUES (
@OrderID
,@OPhaseId
,@CreatedBy
)
SELECT @NewOrderId = @OrderId;
END
ELSE
BEGIN
IF (
@OrderNumber IS NOT NULL
AND @OrderNumber <> ''
)
BEGIN
UPDATE [dbo].[Orders]
SET OrderDate = GETDATE()
WHERE OrderId = @OrderID
AND OrderDate IS NULL
END
UPDATE [dbo].[Orders]
SET [CreatedBy] = @CreatedBy
,[OrderNumber] = @OrderNumber
,[Amount] = @Amount
,[TotalAmount] = @TotalAmount
,[AdditionalSalesReps] = @AdditionalSalesReps
,[AdditionalNotes] = @AdditionalNotes
,[PromotionAmt] = @PromotionAmt
,[Subscription] = @Subscription
,[OrderPhaseId] = @OrderPhaseId
,[AMB] = @AMB
,[UpdatedOn] = GETDATE()
WHERE OrderId = @OrderId
AND BillTo = @BillTo
AND ShipTo = @ShipTo;
SELECT @NewOrderId = @OrderId;
END
--Deleting from OrderPromotion
DELETE
FROM [dbo].[OrderPromotions]
WHERE [OrderId] = @OrderID;-- Removing exist Order Promotion for current order
--Deleting from OrderDetailsPromotion
DELETE
FROM OrderDetailPromotions
WHERE OrderDetailId IN (
SELECT OrderDetailId
FROM @OrderDetails
);-- Removing exist Order Promotion for current order
--Deleting from OrderProductAttributes
DELETE
FROM [dbo].OrderProductAttributes
WHERE OrderDetailId IN (
SELECT OrderDetailId
FROM @OrderDetails
WHERE UpdateType = 2
)
AND OrderProductAttributes.OrderId = @OrderID;
--Deleting from OrderProcessings
DELETE
FROM [dbo].[OrderProcessings]
WHERE [OrderId] = @OrderID;
--Deleting from OrderDetails
DELETE
FROM [dbo].OrderDetails
WHERE Id IN (
SELECT OrderDetailId
FROM @OrderDetails
WHERE UpdateType = 2
)
AND OrderDetails.OrderId = @OrderID;
--Insert Into OrderDetails
INSERT INTO [dbo].[OrderDetails] (
[OrderId]
,[ProductId]
,[ParentProductId]
,[SegmentId]
,[Quantity]
,[Price]
,[SubscriptionAttributePrice]
,[OneTimeAttributePrice]
,[PromotionSubscriptionAttributePrice]
,[PromotionOneTimeAttributePrice]
,[TotalPrice]
,[SubscriptionTerm]
,[SubscriptionStartDate]
,[SubscriptionEndDate]
,[SubscriptionTotal]
,[Subscription]
,[CreatedBy]
)
SELECT @OrderID
,[ProductId]
,[ParentProductId]
,[SegmentId]
,[Quantity]
,[Price]
,[SubscriptionAttributePrice]
,[OneTimeAttributePrice]
,[PromotionSubscriptionAttributePrice]
,[PromotionOneTimeAttributePrice]
,[TotalPrice]
,[SubscriptionTerm]
,[SubscriptionStartDate]
,[SubscriptionEndDate]
,[SubscriptionTotal]
,[Subscription]
,@CreatedBy
FROM @OrderDetails
WHERE OrderDetailId = 0
AND UpdateType = 0;
--Inserting New Order Details ID in @TempOrderDetails
INSERT INTO @TempOrderDetails (
OrderId
,OrderDetailId
,ProductID
)
SELECT A.OrderId
,A.ID
,A.ProductId
FROM OrderDetails A
INNER JOIN @OrderDetails B ON A.ProductId = B.ProductID
AND A.OrderId = @OrderId
WHERE B.OrderDetailId = 0
AND B.UpdateType = 0;
--Updating OrderDetails
UPDATE [dbo].[OrderDetails]
SET [OrderId] = A.OrderId
,[ProductId] = A.ProductId
,[ParentProductId] = A.ParentProductId
,[SegmentId] = A.SegmentId
,[Quantity] = A.Quantity
,[Price] = A.Price
,[SubscriptionAttributePrice] = A.[SubscriptionAttributePrice]
,[OneTimeAttributePrice] = A.[OneTimeAttributePrice]
,[PromotionSubscriptionAttributePrice] = A.[PromotionSubscriptionAttributePrice]
,[PromotionOneTimeAttributePrice] = A.[PromotionOneTimeAttributePrice]
,[TotalPrice] = A.TotalPrice
,[SubscriptionTerm] = A.SubscriptionTerm
,[SubscriptionStartDate] = A.SubscriptionStartDate
,[SubscriptionEndDate] = A.SubscriptionEndDate
,[SubscriptionTotal] = A.SubscriptionTotal
,[Subscription] = A.Subscription
,[UpdatedOn] = GETDATE()
FROM @OrderDetails A
INNER JOIN OrderDetails B ON A.OrderDetailId = B.Id
WHERE B.OrderId = @OrderID
AND A.UpdateType = 1;
--Insert Into [dbo].[OrderProductAttributes]
INSERT INTO [dbo].[OrderProductAttributes] (
[OrderId]
,[OrderDetailId]
,[ProductId]
,[AttributeId]
,[Product_ProductAttribute_MappingId]
,[ProductAttributeValueId]
,[AttributeType]
,[AttributeName]
,[Name]
,[IsSubscription]
,[PriceAdjustment]
,[Quantity]
,[CustomerEntersQty]
,[TotalPriceAdjustment]
,CreatedBy
)
SELECT B.OrderId
,B.OrderDetailId
,A.ProductId
,A.AttributeId
,A.Product_ProductAttribute_MappingId
,A.ProductAttributeValueId
,A.AttributeType
,A.AttributeName
,A.Name
,A.IsSubscription
,A.PriceAdjustment
,A.Quantity
,A.CustomerEntersQty
,A.TotalPriceAdjustment
,@CreatedBy
FROM @OrderProductAttributes A
INNER JOIN @TempOrderDetails B ON A.ProductId = B.ProductID
WHERE [OrderProductAttributeId] = 0;
--Updating OrderProductAttributes
UPDATE [dbo].[OrderProductAttributes]
SET [OrderDetailId] = A.OrderDetailId
,[ProductId] = A.ProductId
,[AttributeId] = A.AttributeId
,[Product_ProductAttribute_MappingId] = A.Product_ProductAttribute_MappingId
,[ProductAttributeValueId] = A.ProductAttributeValueId
,[AttributeType] = A.AttributeType
,[AttributeName] = A.AttributeName
,[Name] = A.Name
,[PriceAdjustment] = A.PriceAdjustment
,[IsSubscription] = A.IsSubscription
,[Quantity] = A.Quantity
,[CustomerEntersQty] = A.CustomerEntersQty
,[TotalPriceAdjustment] = A.TotalPriceAdjustment
,[UpdatedOn] = GETDATE()
FROM @OrderProductAttributes A
INNER JOIN OrderProductAttributes B ON A.OrderProductAttributeId = B.Id
WHERE A.OrderDetailId IN (
SELECT OrderDetailId
FROM @OrderDetails
WHERE UpdateType = 1
);
--Insert Into [dbo].[OrderDetailPromotions]
INSERT INTO [dbo].[OrderDetailPromotions] (
[OrderDetailId]
,[ProductId]
,[PromotionId]
,[UniquePromotionId]
,[PromotionTypeId]
,[PromotionPrice]
,[ClassificationLevel]
)
SELECT ODP.OrderDetailId
,ODP.ProductId
,ODP.PromotionId
,ODP.UniquePromotionId
,ODP.PromotionTypeId
,ODP.PromotionPrice
,ODP.[ClassificationLevel]
FROM @OrderDetailPromotions ODP
INNER JOIN @OrderDetails A ON ODP.OrderDetailId = A.OrderDetailId
AND UpdateType <> 2;-- If order detail will not in removed status.
IF NOT EXISTS (
SELECT 1
FROM OrderDetails
WHERE OrderDetails.OrderId = @OrderID
) -- We have an empty shopping cart
BEGIN
DELETE
FROM Orders
WHERE OrderId = @OrderID;
END
ELSE
BEGIN
-- If shopping cart is not empty, add order promotion.
--Insert Into [dbo].[OrderPromotions]
INSERT INTO [dbo].[OrderPromotions] (
[OrderId]
,[PromotionId]
,[PromotionTypeId]
,[UniquePromotionId]
,[PromotionCode]
,[PromotionAmt]
)
SELECT OP.OrderID
,OP.PromotionId
,OP.PromotionTypeId
,OP.UniquePromotionId
,OP.PromotionCode
,OP.PromotionAmt
FROM @OrderPromotions OP
END
COMMIT TRANSACTION ShopCT_TRAN;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION ShopCT_TRAN;
SELECT @ErrMsg = ERROR_MESSAGE()
,@ErrSeverity = ERROR_SEVERITY();
RAISERROR (
@ErrMsg
,@ErrSeverity
,1
)
END CATCH;
ЗАВЕРШЕНИЕ
ПЕРЕХОДА
Любая помощь будет заметна.Я попытался вывести второй элемент выбора из условия if и попробовать блок catch. в этом случае это работало. или я могу вставить с помощью отдельного запроса
Комментарии:
1. какую ошибку вы получили
2. Это выдает какую-то ошибку? или он просто завершает выполнение без ошибок?
3.
I have tried to put the second select stament out of if condition
— где этоIF
?4. Сколько записей
SELECT OrderPhaseId FROM OrderPhase WHERE OrderPhase = 'Shopping Carts'
возвращается? Если это больше 1, вы можете добавить TOP 1.5. @TSungur Это, вероятно, больше из-за того, что Иван описал в своем ответе. Первоначально Рамеш не включил полный код, поэтому он был без этих удалений. Если сначала что-то вставить, а затем удалить, ошибки не будет, но ничего не будет добавлено.
Ответ №1:
SET @OrderId = CONVERT(INT, SCOPE_IDENTITY());
...
--Deleting from OrderPromotion
DELETE
FROM [dbo].[OrderPromotions]
WHERE [OrderId] = @OrderID;-- Removing exist Order Promotion for current order
Все работает правильно. Я предполагаю, что вы считаете, что @OrderID
here имеет старое исходное значение, тогда как оно уже изменено на новый идентификатор.
Чтобы исправить это, перепишите эту строку на (и здесь вам действительно не нужно явное преобразование):
SET @NewOrderId = SCOPE_IDENTITY();
и использовать @NewOrderId
для вставок и @OrderID
для удалений.
Обратите внимание, вы должны проверить, есть ли открытая транзакция перед откатом внутри блока CATCH. Документы рекомендуют сделать это, проверив значение XACT_STATE()
Комментарии:
1. Я согласен. Изменение поведения
@OrderID
и / или введение@NewOrderId
переменной устранит здесь множество других проблем. Но я думаю, что это не повлияет на поведение этого второго запроса INSERT (для деталей заказа). Итак, несмотря на полезность вашего ответа, я думаю, что он не отвечает на базовый вопрос OP…
Ответ №2:
Второй запрос INSERT вставляет данные из параметра таблицы @OrderDetails
в таблицу [dbo].[OrderDetails]
.
Моим первым предложением было бы проверить результаты запроса SELECT для этой операции вставки. Возможно @OrderDetails
, пусто… Или @OrderDetails
не содержит никаких записей WHERE [OrderDetailId] = 0 AND [UpdateType] = 0
…