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)+@Split_len,(@LongStr_len-LEN(@ShortStr)-@Split_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 ShortStr=@ShortStr) --将分割出来的字符串放入表中
  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 ShortStr=@LongStr)
 ELSE IF @LongStr<>''
  INSERT INTO @RTable(ShortStr) SELECT @LongStr
 RETURN
END

数据库自定义表值函数Split(@LongStr, @SplitStr, @IsDistinct )的更多相关文章

  1. sql server 怎样用select语句调用自定义表值函数

    --自定义函数的参数是表的字段,这种情况要用cross apply啦Select B.* FROM [master].[dbo].[分列测试] A cross apply dbo.f_split(应用 ...

  2. 用程序集编写clr表值函数:把正则表达式引入数据库中

    正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...

  3. SQL自定义函数split分隔字符串

    SQL自定义函数split分隔字符串 一.F_Split:分割字符串拆分为数据表 Create FUNCTION [dbo].[F_Split] ( @SplitString nvarchar(max ...

  4. SQL Server自定义字符串分割函数——Split

    我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...

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

    在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...

  6. Oracle使用split和splitstr函数批量分隔字符串

    /* * Oracle 创建 split 和 splitstr 函数 */ /* 创建一个表类型 */ ) / /* 创建 split 函数 */ CREATE OR REPLACE FUNCTION ...

  7. [原创]SQL 表值函数:获取从今天计算起往前自定义天数

    PS:此博文是利用Windows Live Writer 2012编写,格式效果可能不太好. 在我开发过程中,遇到一个统计需求,结果是要求返回从当天起往回推算出自定义输入的天数 为此我写了一个表值函数 ...

  8. [原创]SQL表值函数:获取从当月计算起往前自定义月份数

      今天我现在发现看一篇博文不能够太长,只要能够描述清楚自己想表达的东西,能够让大家知道你要讲什么就行了.因为我今天看了一些长篇博文,真的觉得知识点太多了, 会让人囫囵吞枣. 这篇博文跟我昨天发表的类 ...

  9. sqlserver自定义函数(标量值函数,表值函数)

    用户自定义的函数有两类:表值函数.标量值函数. 表值函数:返回值是数据表的函数 调用方式 select  b.*  from tableA a accross apply Fun_BiaoZhiFun ...

随机推荐

  1. wpf图片切换,幻灯效果

    xaml: <Window x:Class="WpfApplication1.PicShow" xmlns="http://schemas.microsoft.co ...

  2. linq 动态排序,不使用反射

    之前网上搜索的相关方法都是使用了反射的方法来动态获取字段,以实现动态linq排序,但是因为项目组觉得此方法效率低下,所以不予采纳. 所以有了以下代码 public interface IBase{ d ...

  3. Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心

    D. Gadgets for dollars and pounds 题目连接: http://www.codeforces.com/contest/609/problem/C Description ...

  4. //判断是否安装Flash插件

    //判断是否安装Flash插件        var swf;        function IE_Flash() {            try {                var swf ...

  5. [AngularJS] Directive Definition Objects (DDO)

    This function that we just set up is what's called a link function, and it's actually a very small p ...

  6. SQL Server 2008 清空删除日志文件

    USE [master]GOALTER DATABASE STAR9SQL SET RECOVERY SIMPLE WITH NO_WAITGOALTER DATABASE STAR9SQL SET ...

  7. 主函数 main WinMain _tmain _tWinMain 的区别

    main是C/C++的标准入口函数名 WinMain是windows API窗体程序的入口函数.(int WINAPI WinMain()) 中 WINAPI是__stdcall宏,在windef.h ...

  8. h5-3

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Linq lamda表达式Single和First方法

      让我们来看看如何对一个整数数组使用 Single 操作符.这个整数数组的每个元素代表 2 的 1 到 10 次方.先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达 ...

  10. PHP手册总结《预定义变量》

    一:$_GET GET 是通过 urldecode() 传递的. 二:$_SERVER 这个数组中的项目由 Web 服务器创建.不能保证每个服务器都提供全部项目:服务器可能会忽略一些 三:$argc, ...