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 

 

 

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM