題記:哈哈哈,不得不說自己好傻,不過這是自己一個摸索的過程,所以記錄下來
背景:在一個流程審批中,有多個參與者
例如這樣子一個簡單流程:
這個流程的參與者有多個,但是我們需要在查主數據(另一張表的時候)又不可能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