在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来。
split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递到后台做处理的时候却麻烦了,我们这个时候需要把这些当字符串传递到存储过程,在存储过程里面将这些字符串分割成一个个单独的个体,我这里不说数组,是因为存储过程没有数组这一说。
这时候我们就会想到表值函数。表值函数返回的是一个Table类型的表。说到这里我想很多人都想到了,这不就是一个数组形式么?一个表就是一个数组,每一行就是一个数组中的值,但是里面的值怎么遍历或者取出来呢?我想我们可以用游标的形式去遍历出来。
之前我做过一个gompertz的算法模型,将VBA写的算法,全部用存储过程写出来,里面涉及到很多的一位数组,二维数组。我就是用一个个虚拟表写的。
现在我们言归正传!
这里我们先不管内联表值函数还是多语句表值函数。
//语法结构,函数体由一条return语句组成,最后调用的时候跟查表一样CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] } [ ,...n ] ])RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ][ ; ]
这样比较抽象,现在来个具体的使用的函数。
CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000)) RETURNS @tempTable TABLE(id INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000)) AS BEGIN DECLARE @StartIndex INT --开始查找的位置 DECLARE @FindIndex INT --找到的位置 DECLARE @Content VARCHAR(4000) --找到的值 SET @StartIndex = 1 SET @FindIndex=0 --开始循环查找字符串逗号 WHILE(@StartIndex <= LEN(@Text)) BEGIN SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex) IF(@FindIndex =0 OR @FindIndex IS NULL) BEGIN --如果没有找到者表示找完了 SET @FindIndex = LEN(@Text)+1 END SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex))) --初始化下次查找的位置 SET @StartIndex = @FindIndex+1 --把找的的值插入到要返回的Table类型中 INSERT INTO @tempTable ([VALUE]) VALUES (@Content) END RETURN END -------------------------------------------------------------------SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')
这里面涉及到了5个函数。
第一个:LEN() 这个没得说的,就是类似JS中的length
第二个:LTRIM() 这个从字符串左侧删除空格或其他预定义字符
第三个:RTRIM()字符串的末端开始删除空白字符或其他预定义字符
第四个: CHARINDEX(expression1 , expression2 , [ start_location ]) 返回值是 int 这个函数有点意思了,也很重要。
这个函数类似于C#中的StartWith(),IndexWith()等函数。
例子:CustomName包含客户的First Name和Last Name,它们之间被一个空格隔开。我们用CHARINDX函数确定两个名字中间空格的位置。通过这个方法,我们可以分析ContactName列的空格位置,这样可以只显示这个列的last name部分。
第五个:SUBSTRING(str, pos, len) 这个函数类似JS中的substring()是用来抓出一个栏位资料中的其中一部分/截取字符串的一个方法 。
例子:SELECT SUBSTR (Store_Name, 2, 4)FROM GeographyWHERE Store_Name = 'San Diego';
新闻热点
疑难解答