我有一个表用来记录票号入库情况,字段:开始票号beg_ticket,结束票号end_ticket
在入库的时候,要判断当前入库范围内的票之前有无被入过库,如票号001000-005000先入库
如果入000500-001500的时候要检查到其中的001000-001500已经入过库了,不能再入库...
还有二种情况也是要同样处理的,就是004500-006000和000500-006000

解决方案 »

  1.   


    -- 检查函数, 返回1表示检查通过, 为0表示检查不通过
    CREATE FUNCTION dbo.f_check(
    @beg_ticket  char(6),
    @end_ticket  char(6)
    )RETURNS bit
    AS
    BEGIN
    RETURN CASE WHEN EXISTS(
    SELECT * FROM 发票入库表
    WHERE beg_ticket <= @end_ticket
    OR end_ticket >= @beg_ticket)
    THEN 0 ELSE 1 END)
    END
    GO-- 入库之前, 调用这个函数检查一下就行了
    INSERT 发票入库表 
    SELECT * FROM(
    SELECT beg_ticket = '004500', end_ticket = '006000'
    )DATA
    WHERE dbo.f_check(beg_ticket, end_ticket) = 1
      

  2.   

    假如要入库的放在
    @beg_ticket
    @end_ticket
    这样判断
    if exists (
      select 1 from 入库表
      where beg_ticket>=@beg_ticket and beg_ticket<=@end_ticket
         or end_ticket>=@beg_ticket and end_ticket<=@end_ticket
      )
      --已入库出错语句
    else
      --入库语句这里假设beg_ticket=001000,end_ticket=001500表示[001000,001500]包括两头的也就是
    >=001000  <=001500的号都已经入库
      

  3.   

    不管怎么包含, 都不应该插入, 所以做检查的话, 没有必要考虑太多因素.如果楼主要列出与那些记录相冲的话, 那也只需要执行我的函数中的判断语句就行了SELECT * FROM 发票入库表
    WHERE beg_ticket <= @end_ticket
    OR end_ticket >= @beg_ticket
      

  4.   

    select dbo.f_check('000100','000999')--不包含
    select dbo.f_check('000100','001000')--左交叉
    select dbo.f_check('001000','001500')--包含
    select dbo.f_check('001500','002000')--包含
    select dbo.f_check('002000','005000')--包含
    select dbo.f_check('005000','005500')--右交叉
    select dbo.f_check('005500','006500')--不包含
    select dbo.f_check('000100','006500')--左右交叉显然只是判断beg_ticket <= @end_ticket OR end_ticket >= @beg_ticket 是不行的`~
      

  5.   

    这样试试:
    if object_id('tbtest') is not null
          drop table tbtest
    GO
    ----创建测试数据
    create table tbtest(beg_ticket varchar(20),end_ticket varchar(20),id int identity(1,1))
    insert tbtest (beg_ticket,end_ticket)
    select '001000','005000' union all
    select '6000','8000' 
    GO
    if object_id('fntest') is not null
          drop function fntest
    GO
    ----创建检测函数.若指定范围的票据号已存在则返回1,否则返回0
    create function fntest (@begin varchar(20),@end varchar(20))
    returns bit
    as
    begin
    return 
    case when exists
    (
    select * from tbtest 
    where not (cast(beg_ticket as int) > cast(@end as int) or cast(end_ticket as int) < cast(@begin as int))
    ) then 1 else 0 end
    end
    GO
    ----测试
    select dbo.fntest('000500','001500')    /*返回1,表中已经存在该范围的票据*/
    select dbo.fntest('004500','005000')    /*返回1,表中已经存在该范围的票据*/
    select dbo.fntest('000500','006000')    /*返回1,表中已经存在该范围的票据*/
    select dbo.fntest('000500','000900')    /*返回0,表中不存在该范围的票据*/
    select dbo.fntest('005001','005999')    /*返回0,表中不存在该范围的票据*/
    select dbo.fntest('008001','008100')    /*返回0,表中不存在该范围的票据*/----清除测试环境
    drop table tbtest
    drop function fntest