【问题标题】:SQL IF/Case in stored procedure存储过程中的 SQL IF/Case
【发布时间】:2013-03-23 21:59:33
【问题描述】:

我正在尝试创建将在我的 Pickup 表中插入两个值的过程。

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 它不应该插入,因为这个人本月已经提货了。 任何想法如何实现它?

【问题讨论】:

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


    【解决方案1】:

    所以在这种情况下,使用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_ 并使用其他东西作为前缀 - 或者根本不使用前缀!

    【讨论】:

    • hmmm MONTH 给出了 1-12,这不是所需要的
    • 但是所有书籍都建议在存储过程名称中使用sp_
    • @AndreyIvanov:愿意分享至少一本推荐sp_ 作为存储过程前缀的书吗?我很想知道...
    • 如果去年同月有插入怎么办?
    • @marc_s 在你的方法中,系统只是检查系统字节中的相同日期,如果我插入其他日期,它插入没有问题。
    【解决方案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的信息。

    【讨论】:

      【解决方案3】:

      这是您可以使用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
      

      【讨论】:

      • 谢谢!它工作得很棒但是如果我在去年同一个月为同一个客户插入它只是没有插入:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      相关资源
      最近更新 更多