仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 778|回复: 8
打印 上一主题 下一主题

[学习教程] 发布用MySQL完成SQL Server的sp_executesql

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:13:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。从MySQL5.0入手下手,撑持了一个全新的SQL句法:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">PREPAREstmt_nameFROMpreparable_stmt;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">EXECUTEstmt_name[USING@var_name[,@var_name]...];<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">{DEALLOCATE|DROP}PREPAREstmt_name;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">经由过程它,我们就能够完成相似MSSQL的sp_executesql实行静态SQL语句!<Pstyle="TEXT-INDENT:2em">同时也能够避免注进式打击!<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">为了有一个理性的熟悉,<Pstyle="TEXT-INDENT:2em">上面先给几个小例子:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">mysql>PREPAREstmt1FROMSELECTSQRT(POW(?,2)+POW(?,2))AShypotenuse;<Pstyle="TEXT-INDENT:2em">mysql>SET@a=3;<Pstyle="TEXT-INDENT:2em">mysql>SET@b=4;<Pstyle="TEXT-INDENT:2em">mysql>EXECUTEstmt1USING@a,@b;<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|hypotenuse|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|5|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">mysql>DEALLOCATEPREPAREstmt1;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">mysql>SET@s=SELECTSQRT(POW(?,2)+POW(?,2))AShypotenuse;<Pstyle="TEXT-INDENT:2em">mysql>PREPAREstmt2FROM@s;<Pstyle="TEXT-INDENT:2em">mysql>SET@a=6;<Pstyle="TEXT-INDENT:2em">mysql>SET@b=8;<Pstyle="TEXT-INDENT:2em">mysql>EXECUTEstmt2USING@a,@b;<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|hypotenuse|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|10|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">mysql>DEALLOCATEPREPAREstmt2;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">假如你的MySQL版本是5.0.7大概更高的,你还能够在LIMIT子句中利用它,示比方下:mysql>SET@a=1;mysql>PREPARESTMTFROM"SELECT*FROMtblLIMIT?";<Pstyle="TEXT-INDENT:2em">mysql>EXECUTESTMTUSING@a;<Pstyle="TEXT-INDENT:2em">mysql>SET@skip=1;SET@numrows=5;<Pstyle="TEXT-INDENT:2em">mysql>PREPARESTMTFROM"SELECT*FROMtblLIMIT?,?";<Pstyle="TEXT-INDENT:2em">mysql>EXECUTESTMTUSING@skip,@numrows;利用PREPARE的几个注重点:<Pstyle="TEXT-INDENT:2em">A:PREPAREstmt_nameFROMpreparable_stmt;<Pstyle="TEXT-INDENT:2em">预界说一个语句,并将它赋给stmt_name,stmt_name是不辨别巨细写的。<Pstyle="TEXT-INDENT:2em">B:即便preparable_stmt语句中的?所代表的是一个字符串,你也不必要将?用引号包括起来。<Pstyle="TEXT-INDENT:2em">C:假如新的PREPARE语句利用了一个已存在的stmt_name,那末原本的将被当即开释!即便这个新的PREPARE语句由于毛病而不克不及被准确实行。<Pstyle="TEXT-INDENT:2em">D:PREPAREstmt_name的感化域是以后客户端毗连会话可见。<Pstyle="TEXT-INDENT:2em">E:要开释一个预界说语句的资本,可使用DEALLOCATEPREPARE句法。<Pstyle="TEXT-INDENT:2em">F:EXECUTEstmt_name句法中,假如stmt_name不存在,将会激发一个毛病。<Pstyle="TEXT-INDENT:2em">G:假如在停止客户端毗连会话时,没有显式地挪用DEALLOCATEPREPARE句法开释资本,服务器端会本人动开释它。<Pstyle="TEXT-INDENT:2em">H:在预界说语句中,CREATETABLE,DELETE,DO,INSERT,REPLACE,SELECT,SET,UPDATE,和年夜部分的SHOW句法被撑持。G:PREPARE语句不成以用于存储历程,自界说函数!但从MySQL5.0.13入手下手,它能够被用于存储历程,仍不撑持在函数中利用!上面给个示例:CREATEPROCEDURE`p1`(INidINTUNSIGNED,INnameVARCHAR(11))BEGINlable_exit:BEGINSET@SqlCmd=SELECT*FROMtA;IFidISNOTNULLTHENSET@SqlCmd=CONCAT(@SqlCmd,WHEREid=?);PREPAREstmtFROM@SqlCmd;SET@a=id;EXECUTEstmtUSING@a;LEAVElable_exit;ENDIF;IFnameISNOTNULLTHENSET@SqlCmd=CONCAT(@SqlCmd,WHEREnameLIKE?);PREPAREstmtFROM@SqlCmd;SET@a=CONCAT(name,%);EXECUTEstmtUSING@a;LEAVElable_exit;ENDIF;ENDlable_exit;END;CALL`p1`(1,NULL);CALL`p1`(NULL,QQ);DROPPROCEDURE`p1`;
如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-18 18:50:09 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
山那边是海 该用户已被删除
板凳
发表于 2015-1-25 14:00:41 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
柔情似水 该用户已被删除
地板
发表于 2015-2-2 22:20:41 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
莫相离 该用户已被删除
5#
发表于 2015-2-8 14:34:19 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
再见西城 该用户已被删除
6#
发表于 2015-2-25 19:26:22 | 只看该作者
入门没那么困难,精通没那么容易
若天明 该用户已被删除
7#
发表于 2015-3-8 02:47:54 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
透明 该用户已被删除
8#
发表于 2015-3-15 21:06:51 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
海妖 该用户已被删除
9#
 楼主| 发表于 2015-3-22 04:16:21 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 04:37

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表