2017-06-07 41 views
1

如果我在下面創建這個存儲過程並運行它,那麼當它應該只是一個查詢時,我從表中取回兩行。MySQL存儲過程在直接查詢返回一個時返回多條記錄

CREATE PROCEDURE `getUserName`(IN Guid VARCHAR(36), IN GameID INT(11)) 
    BEGIN 
     SELECT `Name` as UserName, `GUID` as guid 
     FROM playerdata 
     WHERE `GUID` = Guid AND `GameID` = GameID; 
    END 

    CALL getUserName('86fd1007-4a9c-11e7-b2e2-1803733c2d41', 1001); 

返回參見圖片

但是,如果我只是運行它作爲常規查詢

SELECT `Name` as UserName, `GUID` as guid 
    FROM playerdata 
    WHERE `GUID` = "86fd1007-4a9c-11e7-b2e2-1803733c2d41" AND `GameID` = 1001; 

返回參見圖片

Table Data and Query Results

我不解的行爲考慮......至少對我來說他們是一回事。

+3

重命名存儲過程參數,例如'_Guid'和'_GameID'。請參見[C.1對存儲程序的限制::存儲例程中的名稱衝突](https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html)。 – wchiquito

+1

\'GUID \'和Guid是一樣的東西。這與1 = 1相同。 – Strawberry

+0

那就解釋一下吧。當我切換到SQL時,我一直忘記它在大多數情況下不區分大小寫。 –

回答

1
CREATE PROCEDURE `getUserName`(IN IN_Guid VARCHAR(36), IN IN_GameID INT(11)) 
    BEGIN 
     SELECT `Name` as UserName, `GUID` as guid 
     FROM playerdata 
     WHERE `GUID` = IN_Guid AND `GameID` = IN_GameID ; 
    END 

    CALL getUserName('86fd1007-4a9c-11e7-b2e2-1803733c2d41', 1001); 

試試上面的代碼。

如果輸入的參數具有相同的名稱,列名,這將最終評價等同於1=1所以沒有condition.Means GameID = GameID1=1都是等同的意義。 因此,總是嘗試使輸入和輸出參數名稱與特定表的列名不同。

我曾試過它工作正常。

希望這會幫助你。

+0

你能解釋一下嗎? –

+0

你應該用這個編輯你的問題+1 –

+1

我已經更新了我的答案。 –