字符串分割大全及实例
1. 分割后按顺序取数据 /* --------------------------------------------------- fnMain_GetStrSegment (SQL_SCALAR_FUNCTION) Description: Extracts a specific segment of a string, given the delimiter Usage remarks / example: e.g. Input: 'A•B•C' Delimiter: '•' A = Segment 1 B = Segment 2 C = Segment 3 SELECT dbo.fnMain_GetStrSegment('A•B•C','•',2); --This should return 'B' ---------------------------------------------------*/ BEGIN TRY DROP FUNCTION [dbo].[fnMain_GetStrSegment] END TRY BEGIN CATCH END CATCH GO CREATE FUNCTION [dbo].[fnMain_GetStrSegment](@InputStr nvarchar(max), @Delimiter nvarchar(255), @SegmentNo int) RETURNS nvarchar(max) AS BEGIN DECLARE @Result nvarchar(max),@StartPos int,@EndPos int,@Cnt int,@DelimLen tinyint; SELECT @Result='',@Cnt=1,@DelimLen=CASE WHEN @Delimiter=N' ' THEN 1 ELSE LEN(@Delimiter) END; WHILE @Cnt<=@SegmentNo BEGIN IF @Cnt=1 BEGIN SET @StartPos=1 END ELSE BEGIN SET @StartPos=ISNULL(CHARINDEX(@Delimiter,@InputStr,@StartPos),0)+@DelimLen; IF @StartPos<=1 RETURN ''; END SET @EndPos=ISNULL(CHARINDEX(@Delimiter,@InputStr,@StartPos),0); IF @EndPos<@StartPos SET @EndPos=LEN(@InputStr)+@DelimLen; SET @Cnt=@Cnt+1; END IF @StartPos>0 AND @EndPos>@StartPos SET @Result=SUBSTRING(@InputStr,@StartPos,@EndPos-@StartPos); RETURN @Result; END GO -------For Example --SELECT dbo.fnMain_GetStrSegment('1|4|5',N'|',2) 2. 分割成整形表 /* --------------------------------------------------- tfMain_StrToTblInt (SQL_TABLE_VALUED_FUNCTION) Description: Function to convert a string into a table of integers by splitting with a given delimiter Usage remarks / example: ---------------------------------------------------*/ BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblInt] END TRY BEGIN CATCH END CATCH GO CREATE FUNCTION [dbo].[tfMain_StrToTblInt](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( Val int ) AS BEGIN DECLARE @TmpVal nvarchar(max); WHILE LEN(@InputStr) > 0 BEGIN SET @TmpVal = LTRIM(RTRIM(LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr))))); SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr)); IF LEN(@TmpVal)>0 AND ISNUMERIC(@TmpVal)<>0 BEGIN INSERT INTO @OutputTable ( Val ) VALUES ( CONVERT(int,@TmpVal) ); END END RETURN; END GO BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblInt_Ordered] END TRY BEGIN CATCH END CATCH GO CREATE FUNCTION [dbo].[tfMain_StrToTblInt_Ordered](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( RowNo int PRIMARY KEY, Val int ) AS BEGIN DECLARE @TmpVal nvarchar(max), @RowNo int; SET @RowNo=1; WHILE LEN(@InputStr) > 0 BEGIN SET @TmpVal = LTRIM(RTRIM(LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr))))); SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr)); IF LEN(@TmpVal)>0 AND ISNUMERIC(@TmpVal)<>0 BEGIN INSERT INTO @OutputTable ( RowNo, Val ) VALUES ( @RowNo, CONVERT(int,@TmpVal) ); IF @@ROWCOUNT>0 SET @RowNo=@RowNo+1; END END RETURN; END GO -------For Example --select val from dbo.[tfMain_StrToTblInt_Ordered]('7•4•5','•') 2. 分割成字符表 /* --------------------------------------------------- tfMain_StrToTblStr (SQL_TABLE_VALUED_FUNCTION) Description: Function to convert a string into a table of strings by splitting with a given delimiter Usage remarks / example: ---------------------------------------------------*/ BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblStr] END TRY BEGIN CATCH END CATCH GO CREATE FUNCTION [dbo].[tfMain_StrToTblStr](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( Val nvarchar(MAX) ) AS BEGIN DECLARE @TmpVal nvarchar(max); WHILE LEN(@InputStr) > 0 BEGIN SET @TmpVal = LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr))); SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr)); INSERT INTO @OutputTable ( Val ) VALUES ( @TmpVal ); END RETURN; END GO BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblStr_Ordered] END TRY BEGIN CATCH END CATCH GO CREATE FUNCTION [dbo].[tfMain_StrToTblStr_Ordered](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( RowNo int PRIMARY KEY, Val nvarchar(MAX) ) AS BEGIN DECLARE @TmpVal nvarchar(max), @RowNo int; SET @RowNo=1; WHILE LEN(@InputStr) > 0 BEGIN SET @TmpVal = LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr))); SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr)); INSERT INTO @OutputTable ( RowNo, Val ) VALUES ( @RowNo, @TmpVal ); IF @@ROWCOUNT>0 SET @RowNo=@RowNo+1; END RETURN; END GO -------For Example --select val from dbo.tfMain_StrToTblStr('1•4•5','•')