【问题标题】:Insert Procedure with IF statement使用 IF 语句插入过程
【发布时间】:2013-04-02 22:14:12
【问题描述】:

我有要升级的程序 它在插入之前在拾取数据表中为客户插入新记录 它正在检查本月是否插入了该客户的新记录,如果是,它没有插入新记录

我正在尝试更新它,以便它检查客户端 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,它仍然插入记录是不对的

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures insert


    【解决方案1】:

    您没有在第二个 IF EXISTS 语句中通过 @ClientID 过滤您的 clients 表,因此它没有按预期工作。试试:

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

    【讨论】:

      【解决方案2】:

      正确的缩进和 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 ...
          );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        相关资源
        最近更新 更多