USE [TempDB]
GO
/****** Object: UserDefinedFunction [dbo].[funSplitToString] Script Date: 2018/1/30 上午 10:27:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*****************************************************************
* Author;
* Create Date:
* Description: 從字串中抽取出一段字串
*
* 若@iBlock = 0, 則回傳全字串
* 若@iBlock過大, 則回傳最後一個Block字串
* 如果找不到分隔符號, 則回傳全字串
*
*****************************************************************/
ALTER FUNCTION [dbo].[funSplitToString]
(
@String varchar(8000),
@Delimiter varchar(10),
@iBlock smallint -- 從1起算
)
Returns varchar(8000)
Begin
--\ 如果找不到分隔符號, 則回傳全字串
If (CharIndex(@Delimiter, @String) = 0)
Begin
Return @String;
End
--\
Declare @i smallint = 1;
Declare @Pos int = 0;
Declare @Loc int = 1;
Declare @iCount int = 0;
--
If (@iBlock > 1)
Begin
While (@i <= 100)
Begin
Set @Pos = CharIndex(@Delimiter, @String, @Loc);
--
If (@Pos > 0)
Begin
Set @Loc = @Pos + Len(@Delimiter);
--
Set @iCount = @iCount + 1;
--
If (@iCount + 1 = @iBlock) Break;
End
--
Set @i = @i + 1;
End
--
If (@iCount + 1 < @iBlock) Return 'Null';
End
--
Set @i = 1;
Set @Pos = 0;
While (@i <= @iBlock)
Begin
Set @Pos = CharIndex(@Delimiter, @String); -- 搜尋 @String 中的 @Delimiter,並在找到時傳回它的開始位置。
--
If (@i = @iBlock)
Begin
If (@Pos > 0) Set @String = Substring(@String, 1, @Pos - 1);
End
Else
Begin
Set @String = Substring(@String, @Pos + 1, 8000);
End
--
Set @i = @i + 1;
End
--\
Return @String;
End
-- Select dbo.fSplitToString('CHARINDEX 會以輸入的定序為基礎來執行比較。若要執行指定定序的比較,您可以利用 COLLATE,將明確定序套用至輸入上', ';', 1);
--
Block1 Block2 Block3 Block4