对于这个问题,有很多人想到了,在程序上,有方法以及处理了,xxx.Split('***') 即可得到一个数组集合,但是假如直接放入SQL中该如何处理呢?

.NET Compact Framework中是这样定义xxx.Split('***')方法的:

同时,他也还有其他参数的同名方法:

下边是我查阅找到的一个理论方法(可作为参考):

public static string[] split(string strinput, string sp)
        {
            string tmp = "";
            int strlen = 0, splen = 0;
            int found = 0;
            string[] rt = null;
            try
            {
                if (strinput == null || sp == null || strinput.Length == 0 || sp.Length == 0)
                {
                    return null;  //初始化一个数组列表(当做动态数组)
                }                  
                ArrayList tmp3 = new ArrayList();
                strlen = strinput.Length;
                splen = sp.Length;
                for (int i = 0; i < strlen; i++)
                {  //查找分隔符
                    found = strinput.IndexOf(sp, i);
                    if (found >= 0)
                    {
                        tmp = "";  //取分隔符前的字符串
                        tmp = strinput.Substring(i, found - i);  //添加到数组列表
                        tmp3.Add(tmp);
                        i = found + splen - 1;
                    }
                    else
                    {
                        string tmp2 = "";  //取最后的字符串
                        tmp2 = strinput.Substring(i);
                        if (tmp2 != "")
                            tmp3.Add(tmp2);
                        break;
                    }
                }  //将动态数组的维数设置成实际存在的元素个数,因为数组列表是以16的倍数递增维数的
                tmp3.TrimToSize();  //转换数组列表为字符串数组,并返回。
                rt = (string[])tmp3.ToArray(typeof(String));
                tmp3.Clear();
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                throw e;
            }
            return rt;
        }

接下来就是转化为SQL:


--ALTER CREATE
--拆分字符串(表值函数)
CREATE FUNCTION [dbo].[SplitStringType](@str nvarchar(max),@spliter nvarchar(10)) 
RETURNS @tb table(ResultsTable nvarchar(256))  
AS
BEGIN
	DECLARE @Num int,@Pos int, @NextPos int ;
	SET @Num = 0 
	SET @Pos = 1 

	WHILE(@Pos <= LEN(@str)) 

	BEGIN 
		SELECT @NextPos = CHARINDEX(@spliter, @str, @Pos)
		IF (@NextPos = 0 OR @NextPos IS NULL) 

		SELECT @NextPos = LEN(@str) + 1 

		INSERT INTO @tb VALUES(RTRIM(LTRIM(SUBSTRING(@str, @Pos, @NextPos - @Pos)))) 
		SELECT @Pos = @NextPos+1 

	END 
	return
END

GO

从上边我们可以看到,其实对于结构来说,还是少不了两个条件,第一就是要被拆分的字符串(xxx),第二就是根据什么拆分(***)。所以也就有了两个参数,然后再进入SQL处理。

执行后,来看看效果吧

select * from dbo.[SplitStringType]('A|B|C|D|EF','|')
select * from dbo.[SplitStringType]('A,B,C,D,EF',',')
select * from dbo.[SplitStringType]('A,B,C|D,EF',',')

 

最后的结果是返回了一个表格,在这里我们可以把结果作为一个临时表处理,或者直接使用也行,根据不同的情况决定。

看到这里了,也许会有人说,这和存储过程有什么区别么?我使用存储过程传递两个参数不是也可以实现么?

我同样也这样想过,只是相对而言,把他作为函数跟好一点。

函数他具有更强的针对性,负责一小部分的一定逻辑即可(不排除有更复杂的存在)

存储过程他可以处理许多的问题,显得很笼统,庞大,并且在中大型项目中,存储过程的数量多了,你还得又去筛选找对应的存储过程

 

我是一个人三座城
一个人生活在三座城市,过去、现在、将来.
期待你的关注!

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐