解决SQLSEVER 存储过程入参不能带入in的参数传带逗号值的办法
2016-07-02 23:12
423 查看
ALTER PROCEDURE [dbo].[P_UpdateUserLeftRightV2] @UserId varchar(50), @TotalBonus decimal(18,2), @LeftUsers varchar(MAX), @RightUsers varchar(MAX) AS BEGIN SET NOCOUNT ON; begin tran begin if @LeftUsers <> '' begin update [User] set LeftTotal=LeftTotal+@TotalBonus,LeftNew=LeftNew+1 where UserID in (<span style="font-family: Arial, Helvetica, sans-serif;">@LeftUser</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span> end if @LeftUsers <> '' begin update [User] set RightTotal=RightTotal+@TotalBonus,RightNew=RightNew+1 where UserID in (@<span style="font-family: Arial, Helvetica, sans-serif;">RightUsers</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span> end update [User] set isupdate = 1 where userid=@UserId; end if @@ERROR<>0 rollback tran else commit tran SET NOCOUNT OFF; END
如上代码:入参 LeftUsers和@RightUsers 是一个字符串,类似 11,22,33,调用后不能实现效果,where不能成立
解决这个问题,可以使用函数来处理,把入参数据构成列在函数的表值函数下面,函数如下
create function [dbo].[f_split](@c varchar(2000),@split varchar(2))
returns @t table(col varchar(20))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
如何调用如下:select col from [dbo].[f_split](@LeftUsers,',')
ALTER PROCEDURE [dbo].[P_UpdateUserLeftRightV2]
@UserId varchar(50),
@TotalBonus decimal(18,2),
@LeftUsers varchar(MAX),
@RightUsers varchar(MAX)
AS
BEGIN
SET NOCOUNT ON;
begin tran
begin
if @LeftUsers <> ''
begin
update [User] set LeftTotal=LeftTotal+@TotalBonus,LeftNew=LeftNew+1 where UserID in (select col from [dbo].[f_split](@LeftUsers,','));
end
if @LeftUsers <> ''
begin
update [User] set RightTotal=RightTotal+@TotalBonus,RightNew=RightNew+1 where UserID in (select col from [dbo].[f_split](@RightUsers,','));
end
update [User] set isupdate = 1 where userid=@UserId;
end
if @@ERROR<>0
rollback tran
else
commit tran
SET NOCOUNT OFF;
END
即可解决。
相关文章推荐
- mysql 性能分析套件
- 卸载oracle删除注册表脚本
- PostgreSQL数据库常用命令
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
- C#使用VS 2010在程序加载时创建Access数据库和表
- Linux下设置memcached访问IP
- 2、MySQL安装和配置
- 一句SQL,判断char列的值是否组成回文字符串
- sql 分组查询效率
- PostgresQL FDW 源码分析之总结
- PostgresQL FDW 源码分析之 postgresIterateForeignScan()
- 学习Discuz! X3.2记录:快速回复插件涉及到哪些数据库表?
- PostgresQL FDW 源码分析之 postgresGetForeignPlan()
- 1、数据库概述
- Navicat Premium 将sqlserver 数据库 导入mysql 中
- 10 篇数据库技术热文
- 使用工具优化 msql 5.6 的配置
- 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
- 深入浅出Mybatis系列(九)---强大的动态SQL
- Redis队列——PHP操作简单示例