海妖 发表于 2015-1-16 20:13:15

发布用MySQL完成SQL Server的sp_executesql

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...];<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可以大规模使用。

莫相离 发表于 2015-2-8 14:34:19

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

再见西城 发表于 2015-2-25 19:26:22

入门没那么困难,精通没那么容易

若天明 发表于 2015-3-8 02:47:54

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

透明 发表于 2015-3-15 21:06:51

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。

海妖 发表于 2015-3-22 04:16:21

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
页: [1]
查看完整版本: 发布用MySQL完成SQL Server的sp_executesql