麻烦各位看一下我的这篇帖子,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
*/