数据库如何处理传参用指定字符隔开参数的情况 如“name1,name3,name5”

共2种方式,

1、数据库内置函数STRING_SPLIT(sql2016之前的版本不支持该函数)

2、自定义自己写表值函数

第一种数据库内置函数STRING_SPLIT 直接拿来用,一般情况就够用了,不过很抱歉我们项目用的数据库竟然不支持,所以就有了第二种情况。

1、数据库内置函数STRING_SPLIT

STRING_SPLIT ( input_string , separator ) //separator 单个字符

declare @strs nvarchar(max)='proname1~proname2~proname3'
declare @delimiter nvarchar(5)='~'
select * from STRING_SPLIT(@strs,@delimiter)

输出为:

2、自定义表值函数

传参@strlist @delimiter 返回 table类型的@T

declare @strs nvarchar(max)='proname1~proname2~proname3'
declare @delimiter nvarchar(5)='~'
select * from fn_split(@strs,@delimiter)

output:

附上fn_split实现的代码:

Create function fn_split
(
@strlist nvarchar(1000),
@delimiter nvarchar(10)
)
Returns @T table
(
id int identity(1,1),
val nvarchar(100)
)
as
/**
找出每个被分隔符隔开的字符串@val,循环插入表变量@B
**/
begin
declare @pos int
declare @val varchar(100)

set @strlist=@strlist+@delimiter while(1=1)
begin
set @pos=charindex(@delimiter,@strlist) if @pos=0 break set @val=substring(@strlist,1,@pos-1)
if @val<>''
insert into @T values(@val) set @strlist= substring(@strlist,@pos+len(@delimiter),len(@strlist)-@pos-len(@delimiter)+1)
--set @strlist=STUFF(@strlist,1,@pos+len(@delimiter),'') --当出现 1~~1 两个相连的分隔符时出现错误
end
return

end

以上两种实现方式的优缺点:

1、内置STRING_SPLIT 函数在2016以上数据库支持,低版本不支持

2、内置STRING_SPLIT 函数分隔符只能传一位字符,而第二种实现方式也就是自定义的表值函数可以传的长度可以自定义,根据函数传参的长度

3、内置STRING_SPLIT函数无法过滤为空的分隔 比如:1,,2,3,4 在自定义中我已经做了过滤只输出不为空的数据

SqlServer Split 的实现的更多相关文章

  1. SqlServer Split函数

    Create FUNCTION [dbo].[SplitToTable] ( @SplitString nvarchar(max), @Separator nvarchar(10)=' ' ) RET ...

  2. SQLServer Split

    ALTER FUNCTION dbo.splitl ( @String VARCHAR(MAX), @Delimiter VARCHAR(MAX) ) RETURNS @temptable TABLE ...

  3. SQLServer实现split分割字符串到列

    网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题. 先贴上某大牛写的sp ...

  4. 【转】sqlserver字符串拆分(split)方法汇总

    Java..net等开发工具具有split功能,最近在Sqlserver中碰到这个需求. 方法1:动态SQL法 ),) set @string='1,2,3,4,5,6,7,8,9,10' set @ ...

  5. (转自aierong原创技术随笔)sqlserver字符串拆分(split)方法汇总

    sqlserver字符串拆分(split)方法汇总   --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5, ...

  6. sqlserver字符串拆分(split)方法汇总

    --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select ...

  7. sqlserver 字符串split

    select value from TF_NJVALUES('3C457A2D-188B-4D99-A822-2968054E1FB8,3C457A2D-188B-4D99-A822-2968054E ...

  8. SQLSERVER中的假脱机spool

    SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...

  9. 一步一步搭框架(asp.netmvc+easyui+sqlserver)-03

    一步一步搭框架(asp.netmvc+easyui+sqlserver)-03 我们期望简洁的后台代码,如下: using System; using System.Collections.Gener ...

随机推荐

  1. pycharm关闭pytest

    在pycharm中,如果py文件以 test 开头,则运行时会使用pytest执行,pycharm关闭pytest方式如下 File -> Settings -> Tools -> ...

  2. C#项目版本号自定义位置自动向上增加小工具设计与实现

    自从毕了业,好久没更新了,今天突发奇想,过来更新一下,嘻嘻! 一般在做版本升级时,要锁定版本号进行对比,然后联网检索可用的升级包信息,在用VS做C#项目组件版本管理时,是一个很麻烦的事,每次Relea ...

  3. 赠送4本《 PHP 程序员面试笔试宝典》

    < PHP 程序员面试笔试宝典>历时一年,由机械工业出版社出版,在 2018 年 11 月问世.全书共八个章节,涉及 面试笔试经验技巧.PHP 基础知识.PHP 进阶知识,PHP 面向对象 ...

  4. Solution -「洛谷 P4320」道路相遇

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),询问 \(u\) 到 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...

  6. JUC之认识ConcurrentHashMap

    ConcurrentHashMap为什么广泛使用?回答这个问题之前先要回忆下几个基本的概念涉及hash的几个数据结构及锁优化(关于锁优化参考JMM之Java中锁概念的分类总结 - 池塘里洗澡的鸭子 - ...

  7. Python中类的两种用法

    第一种用法是使用类生成实例对象.类作为实例对象的模版,每个实例创建后,都将拥有类的所有属性和方法. 第二种用法是用类将多个函数(方法)打包封装在一起,让类中的方法相互配合.

  8. RENIX发送固定个数报文——网络测试仪实操

    在使用RENIX软件时,有时候我们需要发送固定个数报文,那么该如何操作呢?以下为您讲解具体操作步骤. 第一步:预约测试资源 打开Renix软件,连接机箱, 预约端口 第二步:发送固定个数的报文 选中流 ...

  9. 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举

    注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...

  10. Pycharm:设置自带控制台的python版本

    之前在用chr将一个编码转化为对应的字符时,出现以下提示 chr() arg not in range(256) 后来发现,只有python2.x才会出现这种情况,python3.x统一使用unico ...