2015-01-12 4 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 Server показывает мне, что только одна строка получает и действительно последнее значение попадает только в мой стол. Любая идея почему?

+0

Является ли это в TSQL? –

+0

Вы выбираете строку «TOP (1)» из TVP, а затем вставляете эту строку. Итак, конечно, только одна одна строка будет вставлена ​​..... –

ответ

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

questioner пытается вставить все значения переменной таблицы в [dbo]. [OfferPrice], используя хранимую процедуру. мы можем добавить exec в инструкцию Insert. В версии 2010 года это ошибка. –

+0

@ koushikveldanda Я знаю. Его подход ошибочен. Таким образом, используя таблицу ввода во всех запросах внутри хранимой процедуры. Нет версии 2010 года для SQL Server! – dario

+0

жаль, что я имею в виду SQL Server 2008 R2, выпущенный в 2010 году –

Смежные вопросы