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

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';

表值函数与JS中split()的联系的更多相关文章

  1. js中split()方法得到的数组长度

    js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...

  2. JS中split用法和数组中元素的删除

    JS中split用法 <script language="javascript"> function spli(){ datastr="2,2,3,5,6,6 ...

  3. JS中split使用方法和数组中元素的删除

    JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...

  4. 从bind函数看js中的柯里化

    以下是百度百科对柯里化函数的解释:柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.概念太抽象,可能 ...

  5. js中split 正则表示式 (/[,+]/)

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) separator 作为分隔符,separator ...

  6. Js中split()方法的正确使用

    通过 js 获取 QueryString (location.search部分) 参数很常见,网上代码也满天飞.不过现在的框架,基本上都通过路由伪静态了,把以前的 QueryString 变成了pat ...

  7. js中split()和join()的用法

    Split()方法:把一个字符串分割成字符串数组 如上所示:把字符串a按空格分隔,得3个字符串数组. 在如: var  a=”hao are you”  a.split(“”);  得到[h,a,o, ...

  8. js中split,splice,slice方法之间的差异。

    首先我们先来林格斯双击翻译一下: split  劈开, 使分裂: splice   接合; 使结合: slice  切成薄片, 切: 我先是这么区分的:这三个方法最后一个字母是t的是字符串方法,是e的 ...

  9. 截短字符串的函数(JS中适用)

    function cutShort(str){    if(str.length>15){        str=str.substr(0,15)+"...";    }   ...

随机推荐

  1. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  2. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  3. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  4. iOS逆向工程之Reveal工具的安装、配置与使用

    今天博客内容比较简单,不过还是蛮重要的.经常有小伙伴在QQ上私下问我,说博客中是如何使用Reveal查看AppStore中下载应用的UI层级的,那么就在今天这篇博客中作为一个主题来统一的介绍一下吧.虽 ...

  5. PHP好用但又容易忽略的小知识

    1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...

  6. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  7. 使用DeviceOne实现微信小程序功能

    微信小程序即将推出,还没推出就火的不行了.基于微信这个巨大平台,小程序必然能有巨大成功.不过它并不能完全取代App,该开发App还得开发.如果我们自己想实现一个基于自己的APP包含类似微信的小程序功能 ...

  8. Web安全开发之验证码设计不当引发的撞库问题

    感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复.以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题,甚至在一些银行或者电商的登录与查存页面同样存在这个问题,一旦造成撞库无论对 ...

  9. nginx启动报错:/usr/local/nginx/sbin/nginx: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

    查看依赖库:

  10. 关于Hadoop用户体系的设想(胡思乱想)

    关于Hadoop的用户体系设计设想 Hadoop并没有一个完整的用户体系,其权限控制的对象,主要是Linux的其它用户(即非安装Hadoop的用户),控制方式也和Linux的文件权限很像,目前权限控制 ...