用MySQL实现SQL Server的Sp_executesql

剑雨雨雨雨

剑雨雨雨雨

2016-02-19 19:52

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐用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 SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
  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 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。

  D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。

  F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。

  G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。

  H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。

  I: 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`;

展开更多 50%)
分享

猜你喜欢

用MySQL实现SQL Server的Sp_executesql

编程语言 网络编程
用MySQL实现SQL Server的Sp_executesql

系统存储过程sp_executesql

编程语言 网络编程
系统存储过程sp_executesql

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用ASP实现从SQL Server导出数据到Access

ASP
用ASP实现从SQL Server导出数据到Access

MySQL和SQL Server到底选择谁?

编程语言 网络编程
MySQL和SQL Server到底选择谁?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

MySQL和SQL Server,到底选择谁?

SQLServer
MySQL和SQL Server,到底选择谁?

Sql Server 2000 行转列的实现(横排)

编程语言 网络编程
Sql Server 2000 行转列的实现(横排)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS 针对 Safari(WebKit)的 CSS 注意事项

CSS 针对 Safari(WebKit)的 CSS 注意事项

Dreamweaver4简明教程(七、网页的排版)

Dreamweaver4简明教程(七、网页的排版)
下拉加载更多内容 ↓