允许在SQL Server中不使用查询输入数据

时间:2014-01-17 09:12:02

标签: sql sql-server

用户输入两个数据,即间隔期,并在数据库中存储为INT。 假设我有以下数据:

Table :cheque_book_mcg

id   acc_no  cheq_bk_no cheq_no_frm cheq_no_to sch_id no_from       no_to
401 010000001 285      01029101     01029125    010   29101        29125
402 001000467 277      00130326     00130350    001   30326        30350
403 001000467 54       00122252     00122275    001   22252        22275
404 001000467 1149     00167551     00167575    001   67551        67575
405 003000016 45       00322301     00322325    003   22301        22325
406 001000468 46       00122326     00122350    001   22326        22350
407 001000470 335      00122401     00122425    001   22401        22425
408 001000471 848      00164651     00164675    001   64651        64675
409 001000471 1346     00145476     00145500    001   45476        45500

用户可以根据需要输入间隔(no_from和no_to),这不是重复条目。 这样,在本上下文中,用户可以输入(no_from = 1和no_to = 10)然后输入if 用户输入(21和30)它也必须是有效的,并且之间还有间隔,所以如果用户想要从(11和20)添加数据,它应该是有效的,参考上面输入的数据,用户也可以输入剩余的间隔,在上表中最高的间隔是(67551和67575),所以用户也可以输入从(67576等等)开始的间隔,也可以输入用户间隔低于上面输入的间隔以及输入数据之间的缺失间隔。但不应该重复,间隔。我写了一个查询如下:

SELECT
CASE WHEN ((select MAX(id) from cheque_book_mcg WHERE no_to < 1) = (select MIN(id) from cheque_book_mcg WHERE no_from <= 20))
THEN
'yes'
ELSE
'no'
END as valid

这适用于输入表格中可用数据之间的间隔,但不适用于低于先前输入的间隔的较低间隔,并且对于高于先前输入的间隔的更高间隔不起作用。

如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以按exists()条件检查您要检查的范围,如

if exists( select id from cheque_book_mcg 
           where ((@from_no between no_from and no_to) 
           or (@to_no between no_from and no_to)))
print 'no' -- already range exists, don't insert
else
print 'yes' -- no any range, can insert

使用CASE WHEN子句,如

SELECT CASE WHEN exists( select id from cheque_book_mcg 
                         where ((@from_no between no_from and no_to) 
                         or (@to_no between no_from and no_to)))
            THEN 'no' ELSE 'yes' END as Valid

答案 1 :(得分:0)

这样的触发器会阻止为给定的帐号插入重叠的支票号范围:

CREATE TRIGGER PreventOverlappingChequeNumbers ON cheque_book_mcg 
FOR INSERT, UPDATE AS
BEGIN

    IF EXISTS(
        SELECT *
        FROM cheque_book_mcg cbm
        INNER JOIN inserted i
        ON ((cbm.no_from <= I.no_to AND i.no_from <= cbm.no_from)
        AND cbm.acc_no = i.acc_no))
    BEGIN
        RAISERROR('Cheque number ranges may not overlap', 16, 1)
        ROLLBACK
    END
END