存储过程参数个数怎么动态化?

baidu_35289351 2016-12-16 10:36:21
如:物料表(编号,名称,类别)当然,很多,这列出几个。

alter proc [dbo].[select_wl]
@bh varchar(6)=null,
@mc varchar(40)=null,
@lb varchar(20)=null

as
begin
declare @set varchar(8000)
set @set=null


if @mc is not null set @set=isnull(@set+',','') + '名称=''' + @mc +''''
if @lb is not null set @set=isnull(@set+',','') + '类别=''' + @lb +''''

if @set is not null set @set='update 物料表 set ' + @set + ' where 编号=''' + @bh +''''

select @set
exec(@set)
end

参数固定,我就指定怎么调用,但参数不固定时,怎么调用
--固定参数

declare @bh varchar(6),@mc varchar(40),@lb varchar(20)
set @bh='A00001'
set @mc='49寸大电视'
set @lb='家电'
exec select_wl @bh,@mc,@lb

--那不固定参数时,怎么调用?比如我只更新 “类别",当然,实际上可能是10个字段。。

...全文
576 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
net_steven 2016-12-21
  • 打赏
  • 举报
回复
动态参数传入SP,其实可以传入一个XML串,再解析出各个参数。 sp_dynamic_parametre_test ( @xml varchar(max) ) as begin exec sp_xml_preparedocument @xdoc output, @xml select a.* into #para from openxml (@xdoc, 'xml root path here', 2) with ( field definition here) as a exec sp_xml_removedocument @xdoc select * from #para end --------------------------------------------------- openxml() with 后面也可以是一个表名称,意思参照该物理表的列属性,如果参数有增加,那么就增加物理表的字段即可。 刚看到SQL2016 增加了openJSON() function,那就可以传入JSON了,构建更复杂的参数传入。
Tiger_Zhao 2016-12-19
  • 打赏
  • 举报
回复
看不懂例子?你首先需要请家教。
baidu_35289351 2016-12-19
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
SqlConnection.BeginTransaction 方法 ()
我也看不明白。 roy_88斑竹再不?你有什么好的建议。
闭包客 2016-12-19
  • 打赏
  • 举报
回复
动态的 SQL参数是 .net 里面的一个痛点的,基本都是难看的拼接语句。 使用 EF会可以解决这个问题。 我觉得解决这个问题最好的方法是有 SQL语句的解析器和重写器,Java 有一个开源的,不知道 .net 有没有。
闭包客 2016-12-19
  • 打赏
  • 举报
回复
引用 9 楼 baidu_35289351 的回复:
[quote=引用 7 楼 Tiger_Zhao 的回复:] SqlConnection.BeginTransaction 方法 ()
我也看不明白。 roy_88斑竹再不?你有什么好的建议。[/quote] 在 CLR 里面也可以回滚,ODBC 本身包括事务的接口。包括提交和回滚。 上面的方法就是开始一个事务。
baidu_35289351 2016-12-16
  • 打赏
  • 举报
回复
我在网上查了一下,说可以用,”采用命名法传参“,但我不会用 存储过程可以用事务处理,在程序中直接拼接?也能用事务处理吗? 哪位指点一下。。
Tiger_Zhao 2016-12-16
  • 打赏
  • 举报
回复
存储过程的效率就体现在执行计划预编译,可以重复利用。
动态拼SQL查询体现不出这个优势,还不如程序拼SQL方便呢。
  • 打赏
  • 举报
回复
那就在存储过程设置表中所有字段,作为参数吧,每次调用,都把所有,不管有没有,没有就是null,又就是具体的值,都传入进去。 然后,你在存储过程里拼接sql的时候,if else 判断一下
卖水果的net 版主 2016-12-16
  • 打赏
  • 举报
回复
省略参数时,只能省略后面的,不能省中间的;
shoppo0505 2016-12-16
  • 打赏
  • 举报
回复
没看懂啊,没看懂
baidu_35289351 2016-12-16
  • 打赏
  • 举报
回复
引用 5 楼 zbdzjx 的回复:
感觉还不如在程序中去拼这段SQL了。
直接拼接是可以,我意思是存储过程可以写事务回滚,但直接拼接的SQL语句,能用回滚不?谢谢来个列子?
zbdzjx 2016-12-16
  • 打赏
  • 举报
回复
感觉还不如在程序中去拼这段SQL了。

34,576

社区成员

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

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