2015-01-12 66 views
0

我有这个存储过程:过程只插入一条记录

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服务器让我发现,只有1排得受影响,而且最后的价值只能进入我的表格。任何想法为什么?

+0

它是在TSQL? –

+0

您正在从TVP中选择“TOP(1)”行,然后插入该行。所以当然,只有这一行将被插入..... –

回答

0

基本上,因为你的变量在同一时间不能持有超过一个值,这个说法:

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 

更多的信息在这里:

MERGE (Transact-SQL)

CASE (Transact-SQL)

+0

提问者试图插入表变量的所有值到[dbo]。[OfferPrice]使用存储过程。 我们可以在Insert语句中添加exec吗?在2010年的版本,它是抛出错误。 –

+0

@ koushikveldanda我知道。他的方法是错误的。就是这样,通过在存储过程中的所有查询中使用输入表。没有2010版的SQL Server man! – dario

+0

对不起,我的意思是在2010年发布的SQL Server 2008 R2 –