2013-04-02 56 views
-1

我有要升级的程序 它在插入数据表之前为客户端插入新记录,然后插入它是否检查此客户端的新记录是否在本月插入,如果是则不插入新记录用IF语句插入程序

我想更新它,所以它会检查客户端StatusID在(1,2,6)。到目前为止,我有这个

alter PROCEDURE dbo.InsertPickup 
    @ClientID int, --Required ClientID and PickupDate 
    @PickupDate date 
AS 
    IF NOT EXISTS (SELECT * FROM Pickup 
        WHERE ClientID = @ClientID 
        AND MONTH(PickupDate) = MONTH(@PickupDate) 
        AND YEAR(PickupDate) = YEAR(@PickupDate)) 
if exists (select * from clients where statusid in (1,2,6)) 
     INSERT INTO Pickup (ClientID, PickupDate) 
     VALUES (@ClientID, @PickupDate) 

然而,这是不对的它仍然插入记录,如果与statusid = 5或3或4

回答

1

在你的第二个IF EXISTS声明你不被@ClientID过滤你的clients表,因此它不工作的预期。试试:

if exists (select * from clients where statusid in (1,2,6) AND ClientID = @ClientID) 
1

正确的压痕例如客户端和BEGIN/END包装可以去朝着一个很长的路要走发现查询中的问题。我已将支票添加到ClientID,并且还对PickupDate sargable进行了测试(如果现在有索引或将来会有索引)。

IF NOT EXISTS 
(
    SELECT 1 
    FROM dbo.Pickup WHERE ClientID = @ClientID 
    AND PickupDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, @PickupDate), 0) 
    AND PickupDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, @PickupDate)+1, 0) 
) 
BEGIN 
    IF EXISTS 
    (
    SELECT 1 
     FROM dbo.clients WHERE ClientID = @ClientID 
     AND statusid IN (1,2,6) 
) 
    BEGIN 
     INSERT INTO dbo.Pickup (ClientID, PickupDate) 
     VALUES (@ClientID, @PickupDate); 
    END 
END 

当然,你也可以做到这一点没有所有的嵌套IF测试:

INSERT dbo.Pickup(ClientID, PickupDate) 
    SELECT @ClientID, @PickupDate 
    WHERE EXISTS 
    (
     SELECT 1 FROM dbo.clients WHERE ... 
    ) 
    AND NOT EXISTS 
    (
     SELECT 1 FROM dbo.Pickup WHERE ... 
    );