2013-03-23 70 views
1

我想创建将在我的皮卡表中插入两个值的过程。存储过程中的SQL IF /案例

create procedure sp_InsertPickup 
@ClientID int, 
@PickupDate date 
as 
insert into Pickup (ClientID ,PickupDate)values (@ClientID,@PickupDate) 

不过,我需要检查,如果这个客户已经没有在这一个月皮卡(表记录)它不应该将任何新记录它的表。如果此数据表

ClientID PickupDate 
11  03-01-2013 

我想插入ClientId 11 and new PickupDate 03-24-2013它应该只是不插入,因为这个人这个月已经做了皮卡 例子。 任何想法如何实现它?

回答

2

因此,在这种情况下,使用IF NOT EXISTS

CREATE PROCEDURE dbo.InsertPickup 
    @ClientID int, 
    @PickupDate date 
AS 
    IF NOT EXISTS (SELECT * FROM Pickup 
        WHERE ClientID = @ClientID 
        AND MONTH(PickupDate) = MONTH(@PickupDate) 
        AND YEAR(PickupDate) = YEAR(@PickupDate)) 
     INSERT INTO Pickup (ClientID, PickupDate) 
     VALUES (@ClientID, @PickupDate) 

您可能希望以某种方式显示给调用者,没有插入数据,因为它已经存在的事实....

作为一个附注:您应该而不是使用sp_前缀为您的存储过程。微软有reserved that prefix for its own use (see Naming Stored Procedures),你将来有可能冒名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用别的东西作为前缀 - 或根本没有前缀!

+0

嗯MONTH给1-12,不是很需要 – Phil 2013-03-23 22:03:51

+0

但是,所有的书都推荐在存储过程名称中使用'sp_'? – Andrey 2013-03-23 22:04:22

+1

@AndreyIvanov:关心共享至少一本确实推荐'sp_'作为存储过程前缀的书?我很想知道... – 2013-03-23 22:04:57

1

这是如何使用IF NOT EXISTS

create procedure sp_InsertPickup 
    @ClientID int, 
    @PickupDate date 
as 
    IF NOT EXISTS (SELECT * FROM Pickup 
          WHERE ClientID = @ClientID 
          AND DATEPART(mm,PickupDate) = DATEPART(mm,@PickupDate) 
          AND DATEPART(yy,PickupDate) = DATEPART(yy,@PickupDate)) 
    BEGIN 
     insert into Pickup (ClientID ,PickupDate)values (@ClientID,@PickupDate) 
    END 
begin 
end 
+0

谢谢!它的工作原理非常棒,但是如果我在去年的同一个月为同一个客户端插入,它就不会插入:( – Andrey 2013-03-23 22:10:36

+0

将它标记为已回答,以便它可以使其他人受益:) – 2013-03-23 22:11:56

+0

请参阅我的更新答案...并添加一年。 – 2013-03-23 22:13:56

2

做到这一点,最安全的办法是要么使用merge或把约束放在桌子上,陷阱错误执行。

原因merge更安全是因为它是一个原子事务。检查是否存在,然后然后做插入是危险的,因为其他人可能已经插入(或删除)该行。你可以开始与在存储过程中的事务语义玩,但是当SQL Server提供merge何苦:

merge Pickup as target 
using (select @PickupDate, @ClientId) as source(PickupDate, ClientId) 
    on target.clientId = source.ClientId and year(source.PickupDate) = year(target.PickupDate) and month(source.PickupDate) = month(target.PickupDate) 
when NOT MATCHED then 
    insert(PickupDate, ClientId) values(source.PickupDate, source,ClientId); 

你可以阅读更多关于merge an