最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、SQL 数据库中的存储过程的参数问题

http://bbs.csdn.net/topics/390640511?page=1#post-396062228

怎么将SQL数据库中的存储过程中的参数既作为输出变量又作为输出变量?

--drop proc proc_test --go   create proc dbo.proc_test @in int, @out int out, @in_out int output as  select @out = @in + @in_out,  --1 + 2 = 3        @in_out = @out + 1     --3 + 1 = 4 go   declare @in_p int declare @out_p int declare @in_out_p int  set @in_p = 1; set @in_out_p = 2  exec dbo.proc_test @in_p,                    @out_p out,                    @in_out_p output                      select @in_p,    --输入参数        @out_p,   --输出参数        @in_out_p --输入,输出参数 /* (无列名)   (无列名)   (无列名) 1 3   4 */               

2、在存储过程中的参数问题。

下面是问题:
create table #tableTest(id int identity , name varchar(20),age int,) go insert into #tableTest select '小明',23 union all select '小红',28 union all select '小军',27 go select *from #tableTest go   create proc procTest @name varchar(20), @age int, @IDs varchar(30) as begin select *from #tableTest where 1=1 end  --当我传入@name参数等于 小明,23岁,还有ID在(1,3)的时候 --我怎么可以弄成可选的参数 --比如,name不为空时候 select *from #tableTest where 1=1 and name like '小明' --如果name参数为空的时候,IDs参数不为空的时候 select *from #tableTest where 1=1 and id in(1,3) --请问一下,就有参数不为空的时候存储过程中的SQL追加条件,为空的时候就不追加,这样带可选参数的存储过程怎么写,以及怎么调用,请帮小弟写一个实例 

这种问题,本质上就是根据传入的参数不同,进行不同的查询,也就是where 后面的查询条件是动态的。
一般有2中处理方式,一种就是写动态语句,但动态语句由于是动态拼接字符串,所以比较难维护,而且如果存储过程需要执行多次,那么每次都需要重新编译,但每次生成的执行计划,应该是比较优化的。但如果拼接字符串部分,只是少量的话,还是可以用动态语句的,下面我的解法就是用动态语句来实现的,结构清晰,易于维护。
另一种,就是通过在where语句后面写case when来进行判断,这种方法的好处是不用动态拼接语句,但不易于理解,也不易于修改,因为别人不一定能理解你这么写的意思。另一个问题就是性能的问题,因为在原来的公司就用过这种方法,一段时间后,查询非常慢,本来几秒就能出结果,后来几分钟都出不了结果。说实在的,这种方法要求较高的技巧性,也容易出错,不建议使用。
下面是我的解法,用了动态语句来实现,但考虑了维护、测试方面的要求:
--drop table #tableTest  create table #tableTest(id int identity , name varchar(20),age int,) go insert into #tableTest select '小明',23 union all select '小红',28 union all select '小军',27 go select *from #tableTest go  create proc procTest @name varchar(20)=null,@age int = null,@IDs varchar(30) = null as  declare @sql nvarchar(max); set @sql = '';  set @sql = 'select * from #tableTest where 1 = 1';  set @sql = @sql +             case when @name is not null                      then ' and name like ' + QUOTENAME(@name +'%','''')                 when @age is not null                      then ' and age = ' + cast(@age AS varchar)                 when @ids Is not null                      then ' and id in (' + @ids +')'                 else ' '            end  --打印出语句 select @sql  as '语句'  --执行语句 --exec(@sql) go   exec procTest /* 语句 select * from #tableTest where 1 = 1  */  exec procTest '小明',23 /* 语句 select * from #tableTest where 1 = 1 and name like '小明%' */   exec procTest @ids = '2,3' /* 语句 select * from #tableTest where 1 = 1 and id in (2,3) */ 

转载于:https://blog.51cto.com/yupeigu/1368057

在论坛中出现的比较难的sql问题:14(存储过程问题)相关推荐

  1. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )

    最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. MS- ...

  2. 在论坛中出现的比较难的sql问题:5(row_number函数 分页、随机返回数据)

    最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 1.在 ...

  3. 论坛中的验证码的作用

    论坛中的验证码的作用 因为你的WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手段就是 身份欺骗_它通过 在客户端脚 本写入一些代码,然后利用其,客户机在网站,论坛反复登陆,或者攻击者创建一个H ...

  4. 谈谈WEB开发中的苦大难字符集问题

    记得刚做javaweb开发的时候被这个编码问题搞得晕头转向,经常稀里糊涂的编码正常了一会编码又乱了.那个时候迫于项目进度大多都是知其然不知其所以然.后来有时间就把整个体系搞了个遍,终于摸通了来龙去脉. ...

  5. 在论坛中出现的各种疑难问题:日志收缩问题

    最近,在论坛中,遇到了不少疑难的问题,在此特别记录,同时也感谢发帖人的分享.以及其他网友的热心回答. 1.日志暴大,无法收缩,谁来挑战一下! http://bbs.csdn.net/topics/39 ...

  6. 计算机网络考试难吗,网络教育统考中的计算机考试难不难,

    网络教育统考中的计算机考试难不难在线教育统考计算机难考吗,网上教育统考还是比较简单的,其中计算机相对比较容易通过,基本上是一些比较简单的计算机基础,但是不排除这方面不熟练的,需要提前练习,通过率还可以 ...

  7. 应对计算机领域中后门,网络课程论坛中长尾现象的应对策略——以《计算机应用基础》网络课程为例...

    摘要: 进入21世纪以来,互联网就备受关注.由于我国信息设施资源建设稳步推进,互联网的基础更为坚实,发展更为迅速.据权威数据统计,中国至2009年约拥有130万个BBS论坛,数量为全球第一,然而,作为 ...

  8. 安润网提供的游戏下载,您可以到安润网的论坛中下载,无须注册。

    安润网提供的游戏下载,您可以到安润网的论坛中下载,无须注册.www.entrun.com 拳皇KOF97 下载 http://www.entrun.com/forums/thread/380.aspx ...

  9. 我的世界java版探测矿石_《我的世界》六个关于矿石的隐蔽知识,在峡谷中的矿脉最难挖掘?...

    <我的世界>MC关于矿石的六个隐蔽知识,红石数量比钻石多八倍?<我的世界>六个关于矿石的隐蔽知识,在峡谷中的矿脉最难挖掘?在沙盒游戏<我的世界>里面,矿石是一种帮助 ...

最新文章

  1. 宁波Uber优步司机奖励政策(1月18日~1月24日)
  2. TensorFlow实战-AlexNet
  3. android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类
  4. SecureCRT向多个tab窗口发命令
  5. 鸿蒙系统受谷歌影响吗,华为鸿蒙系统,会受到人们的欢迎吗?
  6. OCR文字识别技术总结(三)
  7. kafka 查看消费者组
  8. Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
  9. Android意图Intent总结(隐式意图,显示意图,意图数据传递,意图数据回传)
  10. 教你从零开始学习数据库!
  11. 项目组合、项目集、项目管理实践经验及思考
  12. mysql开启远程登录
  13. 在树莓派中解决浏览器自动更新失败弹框遮挡数据的方案
  14. 双系统linux grub rescue,WindowsUbuntu双系统一键Ghost,提示grub rescue的解决方法
  15. [USACO2019JAN]Sleepy Cow Sorting题解
  16. 用 Python 整理 Excel 表格
  17. 开源工业缺陷数据集汇总,持续更新中(已更新28个)
  18. 步进电机基础(2.1)- 定子相数的分类、结构、原理
  19. Android车载系统app性能自动化测试规划
  20. 从网页到微信小程序开发:一:小程序与普通网页的区别

热门文章

  1. python内置数据结构_Python内置数据结构(一)
  2. iis html 空白页,IIS伪静态html静态页无法访问的解决方法
  3. 华为鸿蒙mate,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!
  4. mysql存储数组类型的数据_mysql中怎么存储数组
  5. 南京工业大学 乐学python_[紫金山乐学帮]南工大研究出新型智能吸附剂,能大大降低能耗...
  6. 小米路由器4a刷第三方固件_小米路由器4A的断网问题初探
  7. matlab怎么更改图形窗口的句柄值,matlab图形句柄属性
  8. springboot 文件上传大小配置
  9. down.php怎么安装,Markdown、phpstudy的安装及配置
  10. java jackson_Jackson 框架的高阶应用