题记:哈哈哈,不得不说自己好傻,不过这是自己一个摸索的过程,所以记录下来
背景:在一个流程审批中,有多个参与者
例如这样子一个简单流程:
这个流程的参与者有多个,但是我们需要在查主数据(另一张表的时候)又不可能left join 上去,毕竟是一对多的关系,所以我的解决办法是创建临时表,
在临时表里新增一列,SenderAndReceder 包含子表所有参与者的ID,并且以逗号隔开
select ROW_NUMBER() OVER(ORDER BY APPROVALDEPARTMENT DESC) AS Row_Index, SenderAndReceder = STUFF((SELECT ','+cast(SenderID as varchar(500))+','+ cast(ReceiveID as varchar(500)) FROM WorkFlowTask WHERE InstanceID = CONVERT(nvarchar(200), a.KEYID) FOR XML PATH('')),1,1,''), case when org.OrgLevel=2 and org.OrgType=1 then org.OrgName when org.OrgLevel=1 and org.OrgType=2 then org1.OrgName when org.OrgLevel=2 and org.OrgType=2 then org.OrgName else '' end OrgName ,a.KEYID,CONTRACTTYPE,BIDDINGTYPEEXPLAIN,APPROVALPERSON,APPROVALDEPARTMENT,STATUS,STATUS2 into #XXB from Flow_TenderReviewApproval a left join Sys_Organize org on org.ID=a.CompanyCode left join Sys_Organize org1 on org1.ID=org.ParentID
接下来是怎么判定的问题:最开始我想着,先查出来再说把,然后用Linq筛选一下不就好了,事实上我这样做了
var rows = new BPM.Platform.BusinessSupport() .GetBiddingReport(pageIndex, pageSize, new Dictionary<string, string>() { {"status",@params.Get("status")}, {"company",@params.Get("company")}, {"date_begin",@params.Get("startDate")+" 00:00:00"}, {"date_end",@params.Get("endDate")+" 23:59:59"}, {"userid",UserID}, {"AppPerson",AppPerson} }, out total); //Linq查询变量 EnumerableRowCollection<DataRow> Querylist; //执行Linq后的DataTable //DataTable newrows = new DataTable(); if (rows.Rows.Count > 0) { Querylist = rows.AsEnumerable(); newrows= Querylist.Where(p => p.Field<string>("SenderAndReceder").Contains(UserNmae)).CopyToDataTable()};
这样也能实现功能,但是我觉得这样不方便,因为这样如果修改的话需要重新部署系统啥的,所以我在想直接就在存储过程里判定了不是更好吗?
带着这样的疑问,我打开了百度:
我他么.....先给自己三个巴掌~~~~~~~~~ 竟然没有想起这个东西
先来看看CHARINDEX的用法:函数 CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置
CHARINDEX ( expression1 , expression2 [ , start_location ] ) --从expression2 中寻找expression1的位置 不存在则返回0
例:
select CHARINDEX('abc','abc,def,666') -- 结果为:1 select CHARINDEX('def,','abc,def,666') -- 结果为:5 select CHARINDEX('abcd','abc,def,666') -- 结果为:0
所以对存储过程进行了优化:只需要在我们的查询条件后面带上这个条件就可以了,避免了去重复操作数据,SenderAndReceder 是刚刚我们整合的所有参与者ID
and CHARINDEX('''+@userid+''',SenderAndReceder)<>0