Sql 过程只插入一条记录

Sql 过程只插入一条记录,sql,sql-server-2008,tsql,stored-procedures,table-valued-parameters,Sql,Sql Server 2008,Tsql,Stored Procedures,Table Valued Parameters,我有一个存储过程: 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 D

我有一个存储过程:

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

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
更多信息请点击此处:


提问者试图使用存储过程将表变量的所有值插入[dbo].[OfferPrice]。我们是否可以在Insert语句中添加exec。在2010版中,它抛出了错误。@koushikveldanda我知道。他的方法是错误的。就是这样,通过在存储过程中的所有查询中使用输入表。没有SQL Server man的2010版本!!对不起,我是指2010年发布的SQL Server 2008 R2。您知道如何在IF语句中使用SELECT吗。当我尝试GETUTCDATE>=从@OfferPriceTVP选择SaleFromDate时,它会给我一个错误,返回多个值?其余部分已修复使用MERGE时要小心,该语句存在一些问题。您正在从TVP中选择前1行,然后插入该行。当然,只会插入一行。。。。。
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