我在这里有一个奇怪的 - 至少对我来说很奇怪。
我正在处理一个相当简单的存储过程。可以基于Web表单将许多参数传递到过程中。其中之一是排序顺序参数。记录可以按song_title,artist或date_uploaded进行排序,但我总是希望返回的记录首先按song_title排序。如果用户选择song_title或艺术家进行排序,这可以正常工作,但如果用户选择' date_uploaded'它似乎会爆炸。我使用简单的IF ... THEN块来评估排序顺序并相应地修改它。
以下是代码:
DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //
CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
select concat('song_title,',orderBy);
IF orderBy='date_uploaded' THEN SET orderBy='date_uploaded DESC';END IF;
select orderBy;
IF orderBy <> 'song_title'
THEN SET orderBy=CONCAT('song_title,',orderBy);
END IF;
select orderBy;
SET @outputSQL=CONCAT('SELECT song_title, artist, disc_number, is_duet, comments
FROM track
WHERE song_title LIKE CONCAT(\'%',searchTitle,'%\')
AND artist LIKE CONCAT(\'%',searchArtist,'%\')
AND is_bad=0
AND is_duet=',duets,'
ORDER BY ',orderBy ,'
LIMIT ',startRecord,',', rowsReturned);
PREPARE stmt FROM @outputSQL;
EXECUTE stmt;
END//
DELIMITER ;
所以,正在发生的事情是在我尝试连接的区块中,歌曲是&#39; song_title&#39;以及orderBy参数中的任何内容,它都会截断该参数的值。所以 date_uploaded DESC 变 date_uplo
对此有何想法?我确信这个问题在IF THEN块中,因为我已经测试了连接代码并且它产生了我想要的结果,但是如果我可以的话,我会感到很惊讶看看语法有什么问题。
答案 0 :(得分:0)
正如评论所指出的那样,问题是orderBy
变量的长度。这就是原因。它被声明为最多20个字符。如果其值不是song_title
,则orderBy
会为其添加song_title,
。该字符串是11个字符。然后,date_uploaded DESC
被截断为前9个字符,这使得order by子句设置为song_title,date_uplo
。
使orderBy变量至少再增加10个字符,问题就会消失。