繁体   English   中英

该过程仅插入一条记录

[英]Procedure inserts only one record

我有这个存储过程:

CREATE PROCEDURE [dbo].[TVP_OfferPrice] @OfferPriceTVP TVP_OfferPrice READONLY
AS 
BEGIN
    DECLARE @OfferId INT;
    DECLARE @CountryId INT ;
    DECLARE @VatRateId INT ;
    DECLARE @SalePrice DECIMAL(16, 4) ;
    DECLARE @SaleFromDate DATETIME;
    DECLARE @SaleToDate DATETIME;
    DECLARE @DefaultPrice DECIMAL(16, 4);
    DECLARE @Price DECIMAL(16,4);

    SELECT  
        @OfferId = a.OfferId, @CountryId = a.CountryId, @VatRateId = a.VatRateId,
        @SalePrice = a.SalePrice, @SaleFromDate = a.SaleFromDate, @SaleToDate = a.SaleToDate, 
        @DefaultPrice =a.DefaultPrice 
    FROM 
        @OfferPriceTVP a;

    SET @Price = (SELECT TOP 1 pp.Price  
                  FROM [dbo].[Promotion] p 
                  INNER JOIN [dbo].[PromotionProduct] pp ON pp.ProductId = p.Id
                  INNER JOIN [dbo].[Offer] do ON do.ProductId = pp.ProductId AND do.Id = @OfferId 
                  INNER JOIN [dbo].[PromotionAssignment] pda ON pda.PromotionId = p.Id AND pda.Id = do.Id 
                  WHERE p.CountryId = @CountryId
                    AND GETUTCDATE() >= p.ValidFrom AND GETUTCDATE() < p.ValidTo 
                  ORDER BY p.ValidFrom DESC, pp.Price)

    IF(@Price IS NULL AND @SalePrice IS NOT NULL AND GETUTCDATE() >= @SaleFromDate AND GETUTCDATE() < @SaleFromDate)
        SET @Price = @SalePrice

    IF @Price IS NULL
        SET @Price = @DefaultPrice

    IF NOT EXISTS (SELECT * FROM [dbo].[OfferPrice] dop  WHERE dop.OfferId = @OfferId AND dop.CountryId = @CountryId)
        INSERT INTO [dbo].[OfferPrice](OfferId, CountryId, VatRateId, Price, DefaultPrice, SalePrice, SaleFromDate, SaleToDate)
           SELECT 
              @OfferId, @CountryId, @VatRateId, @Price, @DefaultPrice, 
              @SalePrice, @SaleFromDate, @SaleToDate 
    ELSE
        UPDATE b 
        SET b.VatRateId = @VatRateId, @Price = @Price, b.DefaultPrice = @DefaultPrice, 
            b.SalePrice = @SalePrice, b.SaleFromDate = @SaleFromDate, b.SaleToDate = @SaleToDate 
        FROM
            [dbo].OfferPrice b 
        WHERE 
            b.OfferId = @OfferId AND b.CountryId = @CountryId;
END

当我尝试使用一些值执行它时,例如:

DECLARE @OfferPriceTVP AS [dbo].[TVP_DealerOfferPrice]

INSERT INTO @OfferPriceTVP (DealerOfferId, CountryId, VatRateId, DefaultGrossPrice, SaleGrossPrice, SaleFromDate, SaleToDate)
VALUES (10006805, 1, 1, 1, 1, 2, NULL),
(10006806, 1, 1, 2, 1, NULL, NULL),
(10006807, 1, 1, 3, 1, NULL, NULL),
(10006808, 1, 1, 4, 1, NULL, NULL),
(10006809, 1, 1, 5, 1, NULL, NULL),
(10006810, 1, 1, 6, 1, NULL, NULL);

EXEC [dbo].[TVP_DealerOfferPrice] @OfferPriceTVP;
GO

SQL Server向我显示只有1行受到影响,实际上最后一个值仅进入了我的表。 知道为什么吗?

基本上,由于您的变量不能同时持有多个值,因此使用以下语句:

SELECT @OfferId = a.OfferId
      ,@CountryId = a.CountryId
      ,@VatRateId = a.VatRateId
      ,@SalePrice = a.SalePrice
      ,@SaleFromDate = a.SaleFromDate
      ,@SaleToDate = a.SaleToDate
      ,@DefaultPrice = a.DefaultPrice
FROM @OfferPriceTVP a;

您只保存输入表的一条记录。

我猜您正在尝试将输入表与OfferPrice表合并。 因此,最好使用MERGE语句。 这是一个例子:

MERGE OfferPrice AS TARGET
USING (SELECT VatRateId
             ,CASE WHEN Price IS NULL AND SalePrice IS NOT NULL AND GETUTCDATE() >= SaleFromDate AND GETUTCDATE() < SaleFromDate THEN SalePrice ELSE DefaultPrice END AS Price
             -- And so on and so forth
       FROM @OfferPriceTVP) AS SOURCE
    ON TARGET.OfferId = SOURCE.OfferId
WHEN MATCHED THEN
    UPDATE SET VatRateId = SOURCE.VatRateId
              ,Price     = SOURCE.Price
              -- And so on and so forth
WHEN NOT MATCHED THEN
    INSERT (OfferId, CountryId) -- And so on and so forth
    VALUES (SOURCE.OfferId, SOURCE.CountryId) -- And so on and so forth

更多信息在这里:

合并(Transact-SQL)

案例(Transact-SQL)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM