SqlServer Split 的实现
数据库如何处理传参用指定字符隔开参数的情况 如“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 的实现的更多相关文章
- SqlServer Split函数
Create FUNCTION [dbo].[SplitToTable] ( @SplitString nvarchar(max), @Separator nvarchar(10)=' ' ) RET ...
- SQLServer Split
ALTER FUNCTION dbo.splitl ( @String VARCHAR(MAX), @Delimiter VARCHAR(MAX) ) RETURNS @temptable TABLE ...
- SQLServer实现split分割字符串到列
网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题. 先贴上某大牛写的sp ...
- 【转】sqlserver字符串拆分(split)方法汇总
Java..net等开发工具具有split功能,最近在Sqlserver中碰到这个需求. 方法1:动态SQL法 ),) set @string='1,2,3,4,5,6,7,8,9,10' set @ ...
- (转自aierong原创技术随笔)sqlserver字符串拆分(split)方法汇总
sqlserver字符串拆分(split)方法汇总 --方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5, ...
- 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 ...
- sqlserver 字符串split
select value from TF_NJVALUES('3C457A2D-188B-4D99-A822-2968054E1FB8,3C457A2D-188B-4D99-A822-2968054E ...
- SQLSERVER中的假脱机spool
SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-03
一步一步搭框架(asp.netmvc+easyui+sqlserver)-03 我们期望简洁的后台代码,如下: using System; using System.Collections.Gener ...
随机推荐
- pytest(6)-Fixture(固件)
什么是固件 Fixture 翻译成中文即是固件的意思.它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作 ...
- 《PHP程序员面试笔试宝典》——如何应对自己不会回答的问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,对面试官提出的问题求职者并不是都能回答出来,计算机技术博大精深,很少有人能对计算机技术的各个分支学科了如 ...
- 图解AI数学基础 | 概率与统计
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/83 本文地址:http://www.showmeai.tech/article-det ...
- [自动化]ansible-系统安全加固整改
基线漏洞安全整改 修复环境:centos7及以上 安全基线的概念 安全基线是一个信息系统的最小安全保证,即该信息系统最基本需要满足的安全要求.信息 系统安全往往需要在安全付出成本与所能够承受的安全风险 ...
- 【C# .Net GC】延迟模式 latencyMode 通过API-GC调优
延迟模式 lowlatency 使用环境:后台工作方式只影响第 2 代中的垃圾回收:第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快.GC模式是针对进程配置的,进程运行期间不能 ...
- C# 枚举器(enumerator)
总结: 1.枚举器就像是序列中的"游标"或"书签".可以有多个"书签",移动其中任何一个都可以枚举集合,与其他枚举器互不影响.用来遍历数据结 ...
- Winfrom中关于toolStrip工具栏中按钮背景的设置
在ToolStrip中可以存放很多种控件,一般来说,主要使用的是Button和DropDownButton,通常情况下,Button需要设置图片和文字,网上找了很多个方法都不太靠谱,自己试验了下,下面 ...
- Collection接口和Map接口的 size 方法和 isEmpty方法
一.Collection接口的 size 方法和 isEmpty方法 int size(); 返回列表中元素的数目,如果这个列表包含超过Integer.MAX_VALUE,则返回Integer.MAX ...
- JAVA只要掌握内部类,多继承和单继承都不是问题
摘要:如果实现java的多继承,其实很简单,关键是对于内部类的特征的掌握,内部类可以继承一个与外部类无关的类,保证了内部类天然独立性,根据这个特性从而实现一个类可以继承多个类的效果. 本文分享自华为云 ...
- 列表视图ListView
依然是一个listView的Java文件 1 public class ListViewActivity extends Activity { 2 private ListView lv1; 3 @O ...