欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【MySQL实现SQL Server的sp_executesql】,下面是详细的分享!
MySQL实现SQL Server的sp_executesql
从MySQL 5.0 开始,支持了一个全新的SQL句法:
| 以下为引用的内容:
PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name; |
通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!
同时也可以防止注入式攻击!
为了有一个感性的认识,
下面先给几个小例子:
| 以下为引用的内容:
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a=3; mysql> SET @b=4; mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql> DEALLOCATE PREPARE stmt1;
mysql> PREPARE stmt2 FROM @s; mysql> SET @a=6; mysql> SET @b=8; mysql> EXECUTE stmt2 USING @a, @b; +------------+ | hypotenuse | +------------+ | 10 | +------------+ mysql> DEALLOCATE PREPARE stmt2; |
如果你的MySQL 版本是 5.0.7 或者更高的,你还可以在 LIMIT 子句中使用它,示例如下:mysql> SET @a=1;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
| 以下为引用的内容:
mysql> EXECUTE STMT USING @a; mysql> SET @skip=1; SET @numrows=5; mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?"; |
mysql> EXECUTE STMT USING @skip, @numrows; 使用 PREPARE 的几个注意点:
A:PREPARE stmt_name FROM preparable_stmt;
预定义一个语句,并将它赋给 stmt_name ,stmt_name 是不区分大小写的。
B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。
C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。
D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。
E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。
F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。
G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。
H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
G: PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用! 下面给个示例:
| 以下为引用的内容:
CREATE PROCEDURE `p1`(IN id INT UNSIGNED,IN name VARCHAR(11))BEGIN lable_exit: BEGIN SET @SqlCmd='SELECT * FROM tA '; IF id IS NOT NULL THEN SET @SqlCmd=CONCAT(@SqlCmd , 'WHERE id=?'); PREPARE stmt FROM @SqlCmd; SET @a=id; EXECUTE stmt USING @a; LEAVE lable_exit; END IF; IF name IS NOT NULL THEN SET @SqlCmd=CONCAT(@SqlCmd , 'WHERE name LIKE ?'); PREPARE stmt FROM @SqlCmd; SET @a=CONCAT(name, '%'); EXECUTE stmt USING @a; LEAVE lable_exit; END IF; END lable_exit;END; CALL `p1`(1,NULL);CALL `p1`(NULL,'QQ');DROP PROCEDURE `p1`; |
以上所分享的是关于MySQL实现SQL Server的sp_executesql,下面是编辑为你推荐的有价值的用户互动:
相关问题:sql server2005 命令怎么列举数据库,就像mysql的s...
答:你可以使用sp_helpdb来查看. >>详细
相关问题:sql语句里如何实现给查询记录添加自然序号?
答:通过rownum实现即可。 sql:select rownum , * from tablename where 条件语句。 解释:rownum是隐藏的,查询结果默认从1开始编号,所以肯定会是自然编号的,有多少条,编号就到多少。 >>详细
相关问题:sql server 2008 R2 通过链接服务器访问MySQL问题...
答:https://www.packtpub.com/books/content/mysql-linked-server-sql-server-2008 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
