求 存储过程和Sql语句之间的区别 余额准确越好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求 存储过程和Sql语句之间的区别 余额准确越好相关的知识,希望对你有一定的参考价值。

一般从性能和安全性方面下手 越详细越好

性能上
存储过程优于SQL语句,
原因:存储过程是预编译的,而SQL语句是执行一次就需要编译一次。

安全性
存储过程仍然优于SQL语句,
可以认为存储过程是封装好的,代码没有在程序中直接暴露出来,因此被代码注入的可能性就大大降低,提高程序安全性,而SQL语句则是赤裸裸的放在前台代码中,很容易被黑客利用。

那是不是存储过程就一定好于SQL语句呢?
非也,杀鸡还是用杀鸡的刀吧,比如你只是想取个结果集,那还是用SQL语句就可以了,但是在处理一些稍微复杂的业务逻辑时,还是用存储过程比较好。
参考技术A 1.存储过程编译器事先对存储过程金星了语法检查处理,避免了因SQL语句语法不正确引起运行时出现异常的问题.
2.只在保存存储过程时数据库服务器才进行编译,以后每次执行存储过程都不需要再进行重新编译而一般的SQL语句每执行一次就需要数据库引擎重新编译一次,所以使用存储过程可以提高数据库执行效率(补充:这点很有用,特别是感觉你的程序和数据库相关有点慢时可以用这点,帮你程序运行的更快)
3.可以在定义存储过程的时候直接检查运行的结果是否正确,可视化的设计界面提高了效率.
4.避免了查询字符串中包含单引号等特殊字符可能会出现的问题
5.一个项目中可能会多处用到相同的SQL语句,使用存储过程便于重用
6.修改灵活方便,当需要修改完成的功能时,只需要修改定义的存储过程即可,不必单独修改每一个引用.

参考资料:c#网络应用编程基础

本回答被提问者采纳
参考技术B 你想问在编写代码时是把SQL语句写在程序中还是写在存储过程中调用哪种好是么?个人建议写在程序中,有错误的话好查。
存储过程执行代码的速度快一些,因为不需要频繁访问网络。不过查找错误非常麻烦,尤其是逻辑错误。
遇到服务器比较慢时还会出现莫名其妙的错误。
比如我遇到过在存储过程中写:delete from table
执行完后table中居然还有数据,而且不只一次,每次结果也不一样,剩几条也不一定。很神。不过这也可能是我用D版的原因。。
3楼说的对,性能和安全性方面当然都是存储过程强
不过不是非常必要,我都不用存储过程
参考技术C SQL是单条语句,处理较简单的逻辑;
存储过程是一个程序,可以处理复杂的逻辑;
性能上如果比较多的SQL查询、插入等操作,用存储过程好,因为存储过程是在数据库一次执行完的,如果用多个SQL完成,每个SQL都会访问数据库,浪费了网络来回时间
参考技术D 在性能上 存储过程避免了数据库和用户的多次交互 节约了时间.而且游标 结果集 等可以快速将大批数据更新 而且存储过程很轻易使用变量绑定 能够提高数据库共享池的命中率 大大提高运行效率
在安全上存储过程可以封装加密 数据库的私密信息不容易泄露 而且事物处理方便 对数据的完整性有保障

mysql存储过程 把SQL语句返回结果赋给一个变量,该SQL语句返回的结果不止一条,该怎么写,新手,求指教!

BEGIN
declare a int default 1;
set a=x;
select userid into @b from userinfo where deptid=a;
select userid,salary from salaryinfo where userid=@b;
END
存储过程如上,第一条SQL语句查询出的结果不止一条 应该怎么改?求大神指教!

参考技术A 在机器上装好sqlserver2005和mysql的驱动,sqlserver2005中在要导出的数据库上点右键,有个导出数据,跟着步骤往下走就行了,期间很可能遇到数据类型转换的问题,快到最后一步时把包保存下来,报错的话,可以把包打开编辑一下。
如果数据量小的话,导入excel里再导到mysql也好
参考技术B 你可以建一个临时表,吧这些数据全存进去
用这条语句
select into
参考技术C 两条合成一条sql:
select A.userid , B.salary from userinfo A inner join salaryinfo B on A.userid=B.userid where A.deptid=a追问

额 我就是把一条拆两天看看效果的...

追答

BEGIN
declare a int default 1;
set a=x;
declare @b table(userid int);
insert into @b select userid from userinfo where deptid=a;
select userid ,salary from eWL_Role where userid in (select * from @b);
END

这个怎么样,满意不?

追问

额 提示说
declare @b table(userid int);
insert into @b select userid from userinfo where deptid=a;附近有语法错误...

追答

select userid ,salary from salaryinfo where userid in (select * from @b);

本回答被提问者采纳
参考技术D 你可以运用java的List接口动态存取你要输出的参数,这不仅只是数据库语句,要用到java追问

额 存储过程要用java吗?

追答

我以为你在制作jsp呢!

第5个回答  2011-12-29 select userid,salary from salaryinfo where userid in
(select userid from userinfo where deptid=@a)

或:
select userid,salary from salaryinfo where exists(
select userid from userinfo where deptid=@a and userinfo.userid=salaryinfo.userid)

推荐第二种,因为exists系统会根据索引进行搜索

以上是关于求 存储过程和Sql语句之间的区别 余额准确越好的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高级存储过程/函数/触发器

存储过程和sql语句有啥区别

存储过程与函数的区别

存储过程和函数之间有几个区别

mysql存储过程 把SQL语句返回结果赋给一个变量,该SQL语句返回的结果不止一条,该怎么写,新手,求指教!

项目开发中使用存储过程和直接使用SQL语句的区别