表值函数与JS中split()的联系

简介:

在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来。

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 Geography WHERE Store_Name = 'San Diego';

转载:http://www.cnblogs.com/zqzjs/p/4552883.html

目录
相关文章
|
22天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
22天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
11 0
|
23天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
1月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=&gt;`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
18 5
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
18 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发
javascript箭头函数
javascript箭头函数
|
1月前
|
JavaScript 小程序
微信小程序 wxml 中使用 js函数
微信小程序 wxml 中使用 js函数
75 0
|
1月前
|
JavaScript 前端开发
JavaScript函数科里化
JavaScript函数科里化