当前位置: 代码迷 >> Sql Server >> SQL 获取以特定字符开头以特定字符扫尾的字符串
  详细解决方案

SQL 获取以特定字符开头以特定字符扫尾的字符串

热度:35   发布时间:2016-04-24 09:09:45.0
SQL 获取以特定字符开头以特定字符结尾的字符串
麻烦各位看一下我的这篇帖子,http://bbs.csdn.net/topics/391006044,给出出招:
ALTER FUNCTION [EXT].[GetFormatSQL]
    (
      @sourceSql NVARCHAR(MAX) ,--原SQL
      @flg VARCHAR(10) --查找匹配的符号
    )
RETURNS NVARCHAR(MAX)
AS 
    BEGIN


        DECLARE @sql NVARCHAR(MAX)

        SET @sql = @sourceSql --复制副本用于替换

--定义一张临时表,用于存储找到匹配字符串处的下标
        DECLARE @IDXTBL TABLE ( num INT, idx INT )
        DECLARE @cnt INT ,
            @idx INT 
        SET @cnt = 0

--循环查找所有匹配符号的下标,存到临时表中
        WHILE PATINDEX('%' + @flg + '%', @sql) > 0 
            BEGIN
                SELECT  @idx = PATINDEX('%' + @flg + '%', @sql)       
                SET @sql = STUFF(@sql, @idx, 1, '{')
                INSERT  INTO @IDXTBL
                        ( num, idx )
                VALUES  ( @cnt, @idx )
                SET @cnt = @cnt + 1  
            END

        DECLARE @count INT ,
            @idxStart INT ,
            @idxEnd INT ,
            @i INT ,
            @str VARCHAR(20) ,
            @num INT
        DECLARE @STRTBL TABLE
            (
              num INT ,
              strsql VARCHAR(20)
            )


--循环上面的下标表,将匹配符号及中间的字符串截出来替换掉
        SELECT  @count = COUNT(*)
        FROM    @IDXTBL
        SET @i = 0
        SET @num = 0
        WHILE @i < @count 
            BEGIN

                SELECT  @idxStart = idx
                FROM    @IDXTBL
                WHERE   num = @i
                SELECT  @idxEnd = idx
                FROM    @IDXTBL
                WHERE   num = @i + 1
                SELECT  @str = SUBSTRING(@sourceSql, @idxStart,
                                         @idxEnd - @idxStart + 1)
                IF NOT EXISTS ( SELECT  1
                                FROM    @STRTBL
                                WHERE   strsql = @str ) 
                    BEGIN
                        INSERT  INTO @STRTBL --将截取的字符串插到临时表中
                                ( num, strsql )
                        VALUES  ( @num, @str )
                        SET @num = @num + 1
                    END

                SET @i = @i + 2

            END

        SELECT  @count = COUNT(*)
        FROM    @STRTBL
        SET @i = 0
        WHILE @i <= @count 
            BEGIN

--将原SQL中匹配的部分用占位符替换掉          
                SELECT  @sourceSql = REPLACE(@sourceSql, strsql,
                                             '{' + CONVERT(VARCHAR(20), @i)
                                             + '}')
                FROM    @STRTBL
                WHERE   num = @i
                SET @i = @i + 1
            END

        RETURN  @sourceSql

    END

------解决思路----------------------

你试过 你的函数的运行速度吗,会不会很慢。

我觉得可以的话,写个c#代码来处理,会比较简单,只是 我不会c#,要不然 我可以帮你写一个。。。
------解决思路----------------------
已回复
------解决思路----------------------
写了一个看看是不是这样效果


USE tempdb
go

CREATE FUNCTION [dbo].[GetFormatSQL]
    (
     @sourceSql NVARCHAR(MAX)
    ,@flg VARCHAR(10)
    )
RETURNS NVARCHAR(MAX)
AS 
BEGIN
DECLARE @Str NVARCHAR(max)
,@SplitStr NVARCHAR(max)
,@SplitStr2 NVARCHAR(max)
,@SplitCount INT
,@i INT
,@j INT
,@k INT

SELECT @sourceSql=@sourceSql+';',@Str='',@SplitStr='',@i=PATINDEX('%[,;]%',@sourceSql),@j=CHARINDEX(@flg,@sourceSql)

Loop1:

IF @j>0 AND  @j<@i
BEGIN
SELECT @SplitStr=LEFT(@sourceSql,@i),@SplitCount=LEN(@SplitStr)-LEN(REPLACE(@SplitStr,@flg,'')),@SplitCount=@SplitCount/2*2,@k=1
WHILE @k<=@SplitCount
BEGIN
SELECT @SplitStr2=CASE WHEN @k%2=1 THEN '{' ELSE '}' END,@SplitStr=STUFF(@SplitStr,CHARINDEX(@flg,@SplitStr,@k),1,@SplitStr2),@k=@k+1
END
SELECT @Str=@Str+@SplitStr,@SplitStr='',@sourceSql=STUFF(@sourceSql,1,@i,''),@i=PATINDEX('%[,;]%',@sourceSql),@j=CHARINDEX(@flg,@sourceSql)

IF @i>0
GOTO Loop1
END
ELSE 
BEGIN
SELECT @SplitStr=LEFT(@sourceSql,@i),@Str=@Str+@SplitStr,@sourceSql=STUFF(@sourceSql,1,@i,''),@i=PATINDEX('%[,;]%',@sourceSql),@j=CHARINDEX(@flg,@sourceSql)

IF @i>0
GOTO Loop1
END

RETURN(LEFT(@Str,LEN(@Str)-1))

END


GO
SELECT [dbo].[GetFormatSQL]('#ABC#','#')
,[dbo].[GetFormatSQL]('#ABC','#')
,[dbo].[GetFormatSQL]('#ABC#EFG#HIJK#123#','#')
,[dbo].[GetFormatSQL]('#ABC#EFG#;HIJK#123#456','#')

/*
{ABC} #ABC {ABC}EFG{HIJK}123# {ABC}EFG#;HIJK{123}456
*/
  相关解决方案