CREATE FUNCTION [dbo].[F3_Split](@LongStr VARCHAR(MAX),@SplitStr VARCHAR(100),@IsDistinct BIT)
RETURNS @RTable TABLE(ID INT IDENTITY PRIMARY KEY,ShortStr VARCHAR(MAX))
AS BEGIN
IF ISNULL(@LongStr,‘‘)=‘‘ --表达式为空或NULL直接返回空表
RETURN
IF ISNULL(@SplitStr,‘‘)=‘‘ --分隔符为空直接返回一条记录的表(存放表达式)
BEGIN
INSERT INTO @RTable(ShortStr) SELECT @LongStr
RETURN
END
DECLARE @Split_len INT
DECLARE @LongStr_len INT
SET @Split_len=LEN(@SplitStr) --分隔符的长度
SET @LongStr_len=LEN(@LongStr) --目前表达式的长度
WHILE CHARINDEX(@SplitStr,@LongStr)>0
BEGIN
DECLARE @ShortStr VARCHAR(1000) --分割后的字符串
SET @ShortStr=SUBSTRING(@LongStr,1,CHARINDEX(@SplitStr,@LongStr)-1) --每次从第1个位置开始取分隔符所在的位置-1为一截
SET @LongStr=SUBSTRING(@LongStr,CHARINDEX(@SplitStr,@LongStr)[email protected]_len,(@LongStr_len-LEN(@ShortStr)[email protected]_len)) --变换表达式的值为剩下的
SET @LongStr_len=LEN(@LongStr) --变换表达式的长度
IF @ShortStr<>‘‘ AND @IsDistinct=1
INSERT INTO @RTable(ShortStr) SELECT @ShortStr
WHERE NOT EXISTS(SELECT 1 FROM @RTable WHERE [email protected]) --将分割出来的字符串放入表中
ELSE IF @ShortStr<>‘‘
INSERT INTO @RTable(ShortStr) SELECT @ShortStr
END
IF @LongStr<>‘‘ AND @IsDistinct=1 --如果最后一截没有分隔符,则直接进入表中
INSERT INTO @RTable(ShortStr) SELECT @LongStr
WHERE NOT EXISTS(SELECT 1 FROM @RTable WHERE [email protected])
ELSE IF @LongStr<>‘‘
INSERT INTO @RTable(ShortStr) SELECT @LongStr
RETURN
END
数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )
时间: 2024-10-08 15:14:16
数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )的相关文章
数据库中的自定义表值函数
看到别人写的函数,一开始看不懂,于是在网上找资料,原来是表值函数,感觉又学到了,满满的充实感,摘录如下: 表值函数 表值函数和标量值函数的不同是 表值函数是返回一个Table类型 Table类型相当与一张存储在内存中的一张虚拟表. 表值函数的语法: CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [
SQL Server自定义字符串分割函数——Split
我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Split ) 所以我自己定义了一个 sql 函数(多声明表值函数),代码如下: 1 USE [Test] 2 GO 3 /****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2017/4/14 23:04:08 ******/ 4
SQL自定义函数split分隔字符串
SQL自定义函数split分隔字符串 一.F_Split:分割字符串拆分为数据表 Create FUNCTION [dbo].[F_Split] ( @SplitString nvarchar(max), --源字符串 @Separator nvarchar(10)=' ' --分隔符号,默认为空格 ) RETURNS @SplitStringsTable TABLE --输出的数据表 ( [id] int identity(1,1), [value] nvarchar(max) ) AS BE
表值函数与JS中split()的联系
在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递到后台做处理的时候却麻烦了,我们这个时候需要把这些当字符串传递到存储过程,在存储过程里面将这些字符串分割成一个个单独的个体,我这里不说数组,是因为存储过程没有数组这一说. 这时候我们就会想到表值函数.表值函数返回的是一个Table类型的表.说到这里我想很多人都想到了,这不就是一个数组形式么?一个表就
用程序集编写clr表值函数:把正则表达式引入数据库中
正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Text.RegularExpressions; using System.Collecti
数据库自定义函数
一.函数 在数据库中都有函数,这些函数属于系统函.除此之外用户也可以编写用户自定义函数.用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其value被称为参数.函数一般功能比较简单,对于mysql函数只有传入参数,不像存储过程一样,有输入输出参数. 数据库函数特点如下: 存储函数将向调用者返回一个且仅返回一个结果值. 存储函数嵌入在sql中使用的,可以在select中调用,就像内建函数一样,比如cos().hex(). 存储函数的
[原创]SQL表值函数:获取从当月计算起往前自定义月份数
今天我现在发现看一篇博文不能够太长,只要能够描述清楚自己想表达的东西,能够让大家知道你要讲什么就行了.因为我今天看了一些长篇博文,真的觉得知识点太多了, 会让人囫囵吞枣. 这篇博文跟我昨天发表的类似,同样是为了解决一个统计需求,结果是要求返回从当月起往回推算出自定义输入的月份 喜欢总结的我,为此写了一个表值函数来解决这一需求.现记录一下,也希望能帮助到一些也遇到此类问题的朋友. 首先我们看一下执行效果图: 返回最近一年即是十二个月的数据,执行调用函数:SELECT * FROM [Fn_Ru
在数据库中使用表值函数分割字符串
新建表值函数: Create function [dbo].[f_split](@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@SourceSql) while @i>=1 begin i
转载——CLR标量函数、表值函数和聚合函数(UDA)
本节主要介绍使用CLR创建标量函数,表值函数和聚合函数. 所谓标量函数指的就是此函数只返回一个值.表值函数返回值是一个表.聚合函数是在select语句中使用的,用来聚合一个结果集,类似于Sum()或是Count()等内置的函数,而且真正的自定义聚合函数目前只能用CLR来实现. 下面的例子使用了SQLServer自带的pubs数据库. 1.CLR标量函数 1.1无参函数 /// /// 标量函数,不带参数 /// /// [Microsoft.SqlServ