用MySQL实现SQL Server的Sp_executesql

2016-02-19 19:52 38 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐用MySQL实现SQL Server的Sp_executesql,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  从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 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。

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

  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 句法被支持。

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

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

来源:https://www.tulaoshi.com/n/20160219/1622041.html

延伸阅读
标签: SQLServer
分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。在过去,开发人员通常需要自己编写程序,使用临时表格来实现分页功能,或者将所有的数据结果集返回到客户端,在客户端进行分页操作。从开发人员或者DBA的角度来看,两种方法都不能令人满意。 随着SQL Server的发布,其中的一些排序函数使得开发人员...
1.安装mysql数据库的ODBC驱动,mysql-connector-odbc-3.51.19-win32.msi 2.打开控制面板管理工具数据源ODBC,在用户DSN中添加一个MySQL ODBC 3.51数据源。 3.在登录login选项卡中输入数据源名称Data Source Name,此处输入MysqlDNS;然后输入服务器Server,用户User,密码Password,输入正确后选择要导入的数据库。在连接选项conn...
一、为什么要备份数据库? 在现实IT世界里,我们使用的服务器硬件可能因为使用时间过长,而发生故障; Windows系列服务器有可能蓝屏或者感染病毒;SQL Server数据库也可能因为误操作或Bug而停止运行。 如何有效备份SQL Server数据库,避免故障真正发生时长时间的宕机,是每个系统管理员必须面对的任务。 二、简单实现S...
标签: SQLServer
      不同数据库平台的互连一般称之为数据库的异构服务,现在各大数据库之间都可以实现这样的异构互连,只是各厂商的具体实现技术不一样,如:在SQL SERVER里面叫做LINKED SERVER,通过ODBC实现与其它数据库的互联。   本文的测试环境为: 操作系统:  WINDOWS2000 SERVER (繁体系统) 安装数据库: SQLSERVER20...
一、ADO简介 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,不仅简单易用,并且不失灵活性.不失为C++利用数据库快速开发的不错选择。 理论就不用我在这儿费话了,网上有很多,但光是理论,也不是不够的,ADO访问数据的方法很灵活,轻易让人混淆.网上大部分的实例都是基...

经验教程

813

收藏

66
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部