允许在SQL Server中使用查询不输入数据
用户输入两个数据,这是一个间隔周期,并作为INT存储在数据库中。 假设我有以下数据:允许在SQL Server中使用查询不输入数据,sql,sql-server,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
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,然后如果
用户输入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
这适用于输入表中可用数据之间的间隔,但不适用于低于先前输入间隔的较低间隔,也不适用于高于先前输入间隔的较高间隔
如何实现此目标???您可以根据需要检查的范围的存在条件进行检查
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
当子句like时使用CASE
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
这样的触发器将防止为给定帐号插入重叠的支票号码范围:
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
是否要防止任何重叠范围?因此,如果存在范围1,20,那么应该拒绝范围11,30?我将尝试回答。我认为这是可行的,但问题是我需要将值“yes”或“no”返回到java代码,是否可以将“print”映射到java代码?您可以返回“yes”或“no”或任何1或0值而不是print。您正在使用存储过程吗?如果有存储过程,则在任何变量中保存是/否值,然后返回它否,我不使用存储过程。像我发布的查询一样,我可以使用ResultSet.getString1跟踪结果,是否可以进行“打印”?请在需要时用CASE检查我的更新答案。