小白求教:为何写存储过程中执行sql语句要拼接字符串呢?

hansjackson 2016-09-21 02:24:24
如题,最近在学习存储过程,看大家似乎写存储过程的代码都是先declare一个变量存储sql语句字符串,然后把参数拼到语句里再exec(@sql)这种执行,我比较困惑为何不直接执行?例如:大家都这样写

create proc myproc @tid varchar(50)
as
declare @sql varchar(1000)
begin
set @sql='select * from mytable where tid='''+@tid+''';
exec(@sql)
end


而不这样写

create proc myproc @tid varchar(50)
as
begin
select * from mytable where tid=@tid;
end

感觉下面写法舒服很多啊,还不用强制转型啥的,为啥不用呢
...全文
864 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yooq_csdn 2016-09-27
  • 打赏
  • 举报
回复
如果“select * from mytable where tid=@tid;”这样能搞定,肯定都这样了。 选择“set @sql='select * from mytable where tid='''+@tid+'''; exec(@sql)”这样的,都是因为上面的方法搞不定
xiaoxiangqing 2016-09-27
  • 打赏
  • 举报
回复
最好不要拼接。
云中客 2016-09-27
  • 打赏
  • 举报
回复
并不是在存储过程中一定要用拼接,一般是在参数传值比较复杂,比如不是单一的查询条件时会用到拼接的方式 你可能是刚接触存储过程,复杂的存储过程使用的拼接情况更多
足球不是方的 2016-09-26
  • 打赏
  • 举报
回复
你例子的情况来说,2种方式没啥区别,但是其他情况下字符串拼接的话更灵活一些,不把where后面的条件写死,用字符串拼接来替代更好,不然你会经常去修改sql语句,字符串的话只需要修改参数就行。
tcmakebest 2016-09-26
  • 打赏
  • 举报
回复
楼主你的想法是对的, 这种情况确实不需要拼接SQL,不要以为在网上看到的都是"好"的.
闭包客 2016-09-26
  • 打赏
  • 举报
回复
在你的例子中肯定是第二种方法好。 在查询条件不确定时第一种更灵活。
yaoyuandejia 2016-09-21
  • 打赏
  • 举报
回复
我习惯这样

create proc myproc 
 @strwhere varchar(200)
as
declare @sql varchar(1000)
begin
set @sql='select * from mytable where 1=1 '+@strwhere;
exec(@sql)
end
如果查询的条件不固定,就可以动态去追加条件, 比如要查所有的数据,@strwhere=‘’ 比如要查性别为男的数据,@strwhere=‘ and sex=1’ 主要就是处理一些查询条件不固定的业务,如果查询条件比较固定,还是直接运行语句比较好。
卖水果的net 版主 2016-09-21
  • 打赏
  • 举报
回复
引用 4 楼 hansjackson 的回复:
那如果@tid只有一个值,两种写法效果没区别吗?
如果只有一个值,绝对是不拼接更好; 动态拼接,不仅仅是传多个值过来,有时候,还会传来一些条件 ,比如 col_name = 'aaa' ,就要拼接一下子了
Ltr2011 2016-09-21
  • 打赏
  • 举报
回复
sql 执行是以整个字符串来执行的,如果你的第二种写法是按参数传到语句里,会进行一次数据类型转换,当Sql语法转换失败的时候,就会抛错,所以要先将语句和参数转换为同类型,都是字符串,然后 执行,而不是字段串加变量(变量的类型不同 有 时间,int ,decimal ...),不同类型相加肯定会出错的
hansjackson 2016-09-21
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
[quote=引用 2 楼 hansjackson 的回复:] 我主要是想知道,为啥要先弄个字符串,再执行这个字符串而不是直接select这种呢?
我在 1# 给你举的例子,你怎么直接 select 呢?[/quote] 那如果@tid只有一个值,两种写法效果没区别吗?
卖水果的net 版主 2016-09-21
  • 打赏
  • 举报
回复
引用 2 楼 hansjackson 的回复:
我主要是想知道,为啥要先弄个字符串,再执行这个字符串而不是直接select这种呢?
我在 1# 给你举的例子,你怎么直接 select 呢?
hansjackson 2016-09-21
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
当 @tid 的值为 123,456 时,要拼接成下面的形式,直接 用等于就不行了 where tid in (123,456)
我主要是想知道,为啥要先弄个字符串,再执行这个字符串而不是直接select这种呢?
卖水果的net 版主 2016-09-21
  • 打赏
  • 举报
回复
当 @tid 的值为 123,456 时,要拼接成下面的形式,直接 用等于就不行了 where tid in (123,456)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧