SQL Server 拆分字符串(函数)
对于这个问题,有很多人想到了,在程序上,有方法以及处理了,xxx.Split('***') 即可得到一个数组集合,但是假如直接放入SQL中该如何处理呢?.NET Compact Framework中是这样定义xxx.Split('***')方法的:同时,他也还有其他参数的同名方法:下边是我查阅找到的一个理论方法(可作为参考):public static string[] split(string
·
对于这个问题,有很多人想到了,在程序上,有方法以及处理了,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',',')
最后的结果是返回了一个表格,在这里我们可以把结果作为一个临时表处理,或者直接使用也行,根据不同的情况决定。
看到这里了,也许会有人说,这和存储过程有什么区别么?我使用存储过程传递两个参数不是也可以实现么?
我同样也这样想过,只是相对而言,把他作为函数跟好一点。
函数他具有更强的针对性,负责一小部分的一定逻辑即可(不排除有更复杂的存在)
存储过程他可以处理许多的问题,显得很笼统,庞大,并且在中大型项目中,存储过程的数量多了,你还得又去筛选找对应的存储过程
我是一个人三座城
一个人生活在三座城市,过去、现在、将来.
期待你的关注!
更多推荐
已为社区贡献1条内容
所有评论(0)