close

USE [TEMPDB]
GO
/****** Object:  UserDefinedFunction [dbo].[FindStr]    Script Date: 2017/7/28 下午 04:24:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


-- =============================================
-- Author:  
-- Create date: 20150212
-- Description: for Split Str

--  select dbo.FindStr('{"FlowStepBtnID":"B20_BtnClose","FlowStepBtnCaption":"結案","FlowStepBtnDesc":"","FlowStepBtnConfirmMsg":"","FlowStepBtnNextStepID":"Z00","FlowStepBtnNextStepName":"正常結案","FlowStepBtnIsNeedOpinion":"N","FlowStepBtnIsMultiSelect":"N","FlowStepBtnIsSendMail":"Y","FlowStepBtnNextStepDealCondition":"END","FlowStepBtnIsAddMultiSubFlow":"N","FlowStepBtnAddSubFlowID":"","FlowStepBtnAddSubFlowStepBtnID":"","FlowStepBtnAddSubFlowStepBtnAssignToList":"","FlowStepBtnChkSubFlowList":"","FlowStepBtnUpdCustIDList":"SetCloseFlow","FlowStepBtnAssignToList":"{\"CFPMain.B20\":\"主流程處理人員\"}","FlowNativeStepBtnCaption":"結案","FlowNativeStepBtnNextStepName":"正常結案"}','FlowStepBtnID','','')

##得到 B20_BtnClose


--  select dbo.FindStr('{"FlowStepBtnID":"B20_BtnClose","FlowStepBtnCaption":"結案","FlowStepBtnDesc":"","FlowStepBtnConfirmMsg":"","FlowStepBtnNextStepID":"Z00","FlowStepBtnNextStepName":"正常結案","FlowStepBtnIsNeedOpinion":"N","FlowStepBtnIsMultiSelect":"N","FlowStepBtnIsSendMail":"Y","FlowStepBtnNextStepDealCondition":"END","FlowStepBtnIsAddMultiSubFlow":"N","FlowStepBtnAddSubFlowID":"",

"FlowStepBtnAddSubFlowStepBtnID":"","FlowStepBtnAddSubFlowStepBtnAssignToList":"","FlowStepBtnChkSubFlowList":"","FlowStepBtnUpdCustIDList":"SetCloseFlow","FlowStepBtnAssignToList":"{\"CFPMain.B20\":\"主流程處理人員\"}","FlowNativeStepBtnCaption":"結案","FlowNativeStepBtnNextStepName":"正常結案"}','FlowStepBtnAssignToList','\','')

##得到 {"CFPMain.B20":"主流程處理人員"}


--  select dbo.FindStr('{"FlowStepBtnID":"B20_BtnClose","FlowStepBtnCaption":"結案","FlowStepBtnDesc":"","FlowStepBtnConfirmMsg":"","FlowStepBtnNextStepID":"Z00","FlowStepBtnNextStepName":"正常結案","FlowStepBtnIsNeedOpinion":"N","FlowStepBtnIsMultiSelect":"N","FlowStepBtnIsSendMail":"Y","FlowStepBtnNextStepDealCondition":"END","FlowStepBtnIsAddMultiSubFlow":"N","FlowStepBtnAddSubFlowID":"","FlowStepBtnAddSubFlowStepBtnID":"","FlowStepBtnAddSubFlowStepBtnAssignToList":"","FlowStepBtnChkSubFlowList":"","FlowStepBtnUpdCustIDList":"SetCloseFlow","FlowStepBtnAssignToList":"{\"CFPMain.B20\":\"主流程處理人員\"}","FlowNativeStepBtnCaption":"結案","FlowNativeStepBtnNextStepName":"正常結案"}','FlowNativeStepBtnNextStepName','','') 

##得到 正常結案

-- =============================================
ALTER  FUNCTION [dbo].[FindStr]

     @InputStr   VARCHAR(MAX),  --字串
  @FindStr    VARCHAR(50),   --尋找字串'str' 
  @ReplaceB   VARCHAR(50),   --是否有置換的值
  @ReplaceA   VARCHAR(50)    --是否有置換的值
)
RETURNS  VARCHAR(500)
AS
BEGIN

DECLARE @RETURNSTR  varchar(MAX)
DECLARE @SplitStr VARCHAR(MAX)     --程式中拆解後的字串
DECLARE @OriSplitStr VARCHAR(MAX)  --保留原始的字串,以利重新再判斷
Declare @NextString varchar(500)
Declare @Pos int
Declare @FindStrPos int
Declare @EndPos int
Declare @NextEndPos int
Declare @Delimiter1  CHAR(1)
Declare @Delimiter2  CHAR(1)
Declare @Delimiter3  CHAR(1)
Declare @Delimiter4  CHAR(1)

SET @Delimiter1  = ','
SET @Delimiter2  = ':'
SET @Delimiter3 = '{'
SET @Delimiter4 = '}'

    SET @RETURNSTR = ''  --回傳的資料

    SET @OriSplitStr = @InputStr
 
 SET @OriSplitStr=substring(@OriSplitStr,2,len(@OriSplitStr)-2)  --頭尾的{}拿掉

 SET @OriSplitStr = @OriSplitStr + ',' --字串最後加上','才能取到最後一個字串

 SET @FindStr = '"' + @FindStr + '"'

 SET @FindStrPos = charindex(@FindStr, @OriSplitStr,1) --確認是否有該字串的存在,找不到回傳NULL
 
 --若存在從那個字串開始後找到","拆解出第一個字串
 if @FindStrPos > 0
 Begin
        SET @EndPos = charindex(@Delimiter1, @OriSplitStr,@FindStrPos) --若從那個字串開始後找到","拆解出第一個字串
  SET @SplitStr = substring(@OriSplitStr,@FindStrPos,@EndPos-@FindStrPos)  --從該字串開始取,直到

     --SET @RETURNSTR += '  @FindStrPos = ' + cast(@FindStrPos as varchar(10)) + '   @EndPos = ' + cast(@EndPos as varchar(10))
  --SET @RETURNSTR += '  @SplitStr = ' + @SplitStr

  --針對有{}裡也有,號的拆出的資料不完整,故要重新判斷後再重新拆解
  SET @NextEndPos =  charindex(@Delimiter3,@SplitStr,1)
  --SET @RETURNSTR = '  @SplitStr = ' + cast(@SplitStr as varchar(100))  + '  @Delimiter3 = ' + cast(@Delimiter3 as varchar(100))  + '  @NextEndPos = ' + cast(@NextEndPos as varchar(100))
  
  if  @NextEndPos > 0
  Begin
      SET @EndPos = charindex(@Delimiter4, @OriSplitStr,@FindStrPos) --若從那個字串開始後找到"}"拆解出第一個字串
   SET @SplitStr = substring(@OriSplitStr,@FindStrPos,@EndPos-@FindStrPos + 2)  --從該字串開始取,直到

   --SET @RETURNSTR += '  @SplitStr = ' + cast(@SplitStr as varchar(500))  + '  @FindStrPos = ' + cast(@FindStrPos as varchar(100))  + '  @EndPos = ' + cast(@EndPos as varchar(100))
  END

  SET @EndPos = charindex(@Delimiter2, @SplitStr,1) --若從那個字串開始後找到":"拆解出第一個字串
  SET @SplitStr = substring(@SplitStr,@EndPos+1,len(@SplitStr)- @EndPos)  --從該字串開始取,直到
 
        --SET @RETURNSTR+= '   @EndPos = ' + cast(@EndPos as varchar(10))
     --SET @RETURNSTR+= '   @SplitStr = ' + @SplitStr

  SET @SplitStr=substring(@SplitStr,2,len(@SplitStr)-2)  --頭尾的""拿掉
  SET @RETURNSTR= @SplitStr
 End

 IF (@ReplaceB <> '') --若有帶入replace的變數,則要replace特定的字元
 BEGIN
  SELECT @SplitStr=REPLACE(@SplitStr,@ReplaceB,@ReplaceA)
  SET @RETURNSTR= @SplitStr
 END
  
 RETURN @RETURNSTR
END

arrow
arrow
    文章標籤
    尋找字串 SQL FUNCTIO
    全站熱搜
    創作者介紹
    創作者 可樂果公主 的頭像
    可樂果公主

    聽說幸福…在山的那邊 (浪機子)

    可樂果公主 發表在 痞客邦 留言(0) 人氣()