2014-09-22 116 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