2014-09-22 45 views
0
mysql> Create Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN sid int,IN tid int,OUT outmsg varchar(50)) 
-> begin 
-> if not exists(
-> SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=Sid OR Tid=tid) then 
-> set outmsg = 'ADDED SUCESSFULLY'; 
-> else 
-> set outmsg = 'RECORD ALREADY PRESENT'; 
-> end if; 
-> end $$ 

mysql> select * from tbltask; 

| tblid | startdate   | enddate    | Sid | Lid | 

|  1 | 2011-05-20 00:00:00 | 2011-05-29 00:00:00 | NULL | NULL | 

1 row in set (0.00 sec) 

它显示为记录已经存在,甚至有没有记录存在于数据库中,逻辑错误在SELECT查询

如果我删除的SID,从选择查询TID它工作正常, 请建议为了一些想法CHK运行正确输出

当我试图调用过程, 它返回的,

mysql> call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg); 
-> select @outmsg; 
-> $$ 

查询OK,0行受到影响(0.00秒)

| @outmsg    | 

| RECORD ALREADY PRESENT | 

1行中集(0.00秒)

但我的实际结果应该为 '已添加成功地'

+1

您在'WHERE'标准中使用'OR'或'Sid = Sid' - 这将永远是真的!删除'OR Sid = Sid OR Tid = tid',它应该可以工作。 – sgeddes 2014-09-22 13:10:44

+0

但我想检查一下sid和tid。 – BeginnerStack1 2014-09-22 13:14:25

+1

将您的输入变量重命名为与表格中的字段名称不同。所以inSid和inTid。知道您是否想要将变量与字段,字段到字段或变量与变量进行比较,引擎可能会遇到问题。我没有看到表格中的TID。我看到LID ...所以这意味着TID输入与TID输入相比...是你想要的吗? – xQbert 2014-09-22 13:19:13

回答

0

“成功添加” 只应报告如果在你的select语句中没有选择记录,但是给定了你的输入变量call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg);你实际上在你的所有OR'd条件中触发了你的6个条件中的4个。

编辑补充:

我已经运行以下(包括结果)。我所做的是更改变量的名称,以便最终不会得到始终为真的WHERE语句(SID=SID or TID=TID将始终为真)。我还更改了SELECT声明以与您的表中的字段名称作为示例相匹配。

CREATE TABLE tbltask 
    (
     tblid int, 
     startdate datetime, 
     enddate datetime, 
     sid int, 
     lid int 
    ); 

INSERT INTO `tbltask`(`tblid`, `startdate`, `enddate`) VALUES (1, '2011-05-20 00:00:00','2011-05-29 00:00:00'); 

DELIMITER // 
CREATE Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN inSid int,IN inLid int,OUT outmsg varchar(50)) 
begin 
if not exists 
(
    SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=inSid OR Lid=inLid 
) then 
    set outmsg = 'ADDED SUCCESSFULLY'; 
else 
    set outmsg = 'RECORD ALREADY PRESENT'; 
end if; 
end 
// 

call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg); 
select @outmsg; 

RECORD ALREADY PRESENT 

call sp_Getnewtask('2010-05-20','2010-05-29',6,8,@outmsg); 
select @outmsg; 

ADDED SUCCESSFULLY 

就目前来看,这似乎是在做它应该做的事情。如果任何一个日期范围应该相交,它会找到该记录。如果它们不相交,但sid或lid匹配,则它会找到记录。查找记录使其报告“记录已存在”

+0

当tid和sid从选择查询中删除时,相同的OR条件正常工作。 – BeginnerStack1 2014-09-22 13:32:02

+0

如果您从WHERE语句中删除TID和SID,则在您调用sp_Getnewtask('2011-05-20','2011-05-29',6,8,@ outmsg)时会得到“添加成功”;' ? – JNevill 2014-09-22 13:36:00

+0

是的我知道,但我需要chk我的查询与sid和tid也相同的查询正确工作在MS SQL中,但它不工作在MYSQL – BeginnerStack1 2014-09-22 13:38:22