在sql server下,执行一个动态查询语句,并把语句中的game_score的结果输出。SET @SQL='SELECT @gamescore=game_score FROM dbo.'
+ @game_table
+ ' WHERE user_id='
+ cast(@userid as varchar(32))
EXEC sp_executesql @SQL,N'@gamescore int output',@gamescore=@game_score output
-- 之后对输出的结果进行操作。如下
SET @game_score=@game_score+1;
IF @game_id >3
BEGIN
....
END现在要用mysql的过程去写这样的动态查询,并也要有个输出结果,如何操作。
MySQLSQL存储搓成 动态查询 参数输出
+ @game_table
+ ' WHERE user_id='
+ cast(@userid as varchar(32))
EXEC sp_executesql @SQL,N'@gamescore int output',@gamescore=@game_score output
-- 之后对输出的结果进行操作。如下
SET @game_score=@game_score+1;
IF @game_id >3
BEGIN
....
END现在要用mysql的过程去写这样的动态查询,并也要有个输出结果,如何操作。
MySQLSQL存储搓成 动态查询 参数输出
建议参考一下MYSQL官方免费手册中的语法说明,然后自己尝试改一下,如果有什么问题可以把你自己写的语句和错误提示一同贴出
用户定义变量的类型包括:integer, decimal, floating-point, binary or nonbinary string, or NULL value而且一个变量在使用过程中类型可以变化,如
mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;
前者为字符串,后面又变成了整型。回到最初的问题,可以这样:
SET @EXEC_SQL:=concat('SELECT @gamescore:=game_score FROM ', @game_table ,' WHERE user_id=cast(',@userid,' as varchar(32))');
PREPARE stmt1 from @EXEC_SQL ;
execute stmt1;
deallocate prepare stmt1 ;SELECT @gamescore;直接使用即可
SET u_SQL =concat('SELECT game_score INTO @gamescore FROM ', @game_table ,' WHERE user_id=',cast(@userid as char));-- 好像不能转到varchar。
SET @v_sql=u_SQL;
PREPARE run_sql FROM @v_sql;
EXECUTE run_sql;
DEALLOCATE PREPARE run_sql;
-- 之后对输出的结果进行操作。如下
SET @game_score=@game_score+1;
IF @game_id >3
BEGIN
....
END自己做了小测试:
用navicat建立的存储过程。
参数:IN in_table_name VARCHAR(30),IN in_where VARCHAR(30)
BEGIN
DECLARE u_SQL VARCHAR(1024);
SET u_SQL=CONCAT('SELECT game_id,game_re,date INTO @u_id,@u_name,@u_date FROM ',in_table_name,' WHERE game_re like ''%',in_where,'%''');
SET @v_sql=u_SQL;
PREPARE run_sql FROM @v_sql;
EXECUTE run_sql;
DEALLOCATE PREPARE run_sql; SET @u_name= CONCAT(@u_name,'游戏');
SELECT @u_id AS game_id,@u_name AS game_name,@u_date AS add_date;
END
CALL sql_sel('t_game_table','四人');正常。
主要注意的是MYSQL要用CONCAT(str,str,...)链接字符串。
其中输出的参数要带“@”如@game。
执行这个动态查询用:
PREPARE run_sql FROM @v_sql;
EXECUTE run_sql;
DEALLOCATE PREPARE run_sql;