2015-01-12 3 views
0

I이 저장 프로 시저가 있습니다절차 삽입 하나의 레코드 만

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 행 가져 내게 보여줍니다

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 

을 내가 예를 들어 어떤 값을 실행하려고 할 때 영향을 받고 실제로 마지막 값은 내 테이블에만 들어갑니다. 왜 그런가?

+0

여기의 예는 무엇입니까? –

+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 

추가 정보 :이 TSQL에

MERGE (Transact-SQL)

CASE (Transact-SQL)

+0

questioner는 [dbo]. [OfferPrice]에 저장 프로 시저를 사용하여 테이블 변수의 모든 값을 삽입하려고합니다. Insert 문에 exec를 추가 할 수 있습니까? 2010 버전에서는 오류가 발생합니다. –

+0

@koushikveldanda 알아. 그의 접근 방식은 잘못되었습니다. 저장 프로 시저 내부의 모든 쿼리에 입력 테이블을 사용하면됩니다. 2010 버전의 SQL Server 사용자는 없습니다! – dario

+0

죄송합니다. 2010 년에 출시 된 SQL Server 2008 R2를 의미합니다. –

관련 문제