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