我有一个表用来记录票号入库情况,字段:开始票号beg_ticket,结束票号end_ticket
在入库的时候,要判断当前入库范围内的票之前有无被入过库,如票号001000-005000先入库
如果入000500-001500的时候要检查到其中的001000-001500已经入过库了,不能再入库...
还有二种情况也是要同样处理的,就是004500-006000和000500-006000
在入库的时候,要判断当前入库范围内的票之前有无被入过库,如票号001000-005000先入库
如果入000500-001500的时候要检查到其中的001000-001500已经入过库了,不能再入库...
还有二种情况也是要同样处理的,就是004500-006000和000500-006000
-- 检查函数, 返回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
@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的号都已经入库
WHERE beg_ticket <= @end_ticket
OR end_ticket >= @beg_ticket
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 是不行的`~
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