Sqlserver CHARINDEX用法

题记:哈哈哈,不得不说自己好傻,不过这是自己一个摸索的过程,所以记录下来

背景:在一个流程审批中,有多个参与者

例如这样子一个简单流程:

 

 

 

 

这个流程的参与者有多个,但是我们需要在查主数据(另一张表的时候)又不可能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 

 

 

 

   

 

posted @ 2021-06-04 16:12  就爱啃西瓜  阅读(1335)  评论(0编辑  收藏  举报