Sql Server数据库中自定义拆分字符串函数Split

合集下载

SQLServer实现split分割字符串到列

SQLServer实现split分割字符串到列

SQLServer实现split分割字符串到列⽹上已有⼈实现sqlserver的split函数可将字符串分割成⾏,但是我们习惯了split返回数组或者列表,因此这⾥对其做⼀些改动,最终实现也许不尽如意,但是也能解决⼀些问题。

先贴上某⼤⽜写的split函数(来⾃:,注意我这⾥将其命名为splitl):12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24ALTER FUNCTION dbo.splitl (@String VARCHAR(MAX),@Delimiter VARCHAR(MAX)) RETURNS@temptable TABLE(items VARCHAR(MAX)) AS BEGINDECLARE@idx INT=1DECLARE@slice VARCHAR(MAX)IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0RETURNWHILE @idx != 0BEGINSET@idx = CHARINDEX(@Delimiter,@String)IF @idx != 0SET@slice = LEFT(@String,@idx - 1)ELSESET@slice = @StringIF LEN(@slice) > 0INSERT INTO@temptable(items) VALUES(@slice) SET@String = RIGHT(@String, LEN(@String) - @idx) IF LEN(@String) = 0BREAKENDRETURNEND其原理还是⽐较简单的,⼀看便知。

调⽤该函数返回的结果是:1SELECT* FROM dbo.splitl('a#b#c#d','#')然⽽我希望得到的结果是:1SELECT'a'a,'b'b,'c'c,'d'd这就要⽤到sqlserver⾏转列的技巧,⽹上有很多⽅法可以参照。

sqlserver中实现split分割字符串函数

sqlserver中实现split分割字符串函数

sqlserver中实现split分割字符串函数常⽤的.IF OBJECT_ID (N'fn_split') IS NOT NULLDROP FUNCTION fn_splitgoCREATE function dbo.fn_split(@inputstr varchar(8000),@seprator varchar(10),@p int --要取第⼏个数据,从0开始,如果要返回分割后的数组列表清删除--##部分即可)returns @temp table (a varchar(200))asbegindeclare @i intdeclare @n int --记录循环的次数set @inputstr = rtrim(ltrim(@inputstr))set @i = charindex(@seprator, @inputstr)SET @n =0 --##WHILE @i>=1beginIF @p=@n --##begininsert @temp values(left(@inputstr, @i - 1))endset @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)set @i = charindex(@seprator, @inputstr)SET @n = @n+1 --##ENDif @inputstr <> '' --最后⼀位IF @p=@n --##insert @temp values(@inputstr)returnendgo⽅法⼀ CREATE FUNCTION uf_StrSplit '1.1.2.50','.'(@origStr varchar(7000), --待拆分的字符串@markStr varchar(100)) --拆分标记,如','RETURNS @splittable table(str_id varchar(4000) NOT NULL, --编号IDstring varchar(2000) NOT NULL --拆分后的字符串)ASBEGINdeclare @strlen int,@postion int,@start int,@sublen int,@TEMPstr varchar(200),@TEMPid intSELECT @strlen=LEN(@origStr),@start=1,@sublen=0,@postion=1,@TEMPstr='',@TEMPid=0if(RIGHT(@origStr,1)<>@markStr )beginset @origStr = @origStr + @markStrendWHILE((@postion<=@strlen) and (@postion !=0))BEGINIF(CHARINDEX(@markStr,@origStr,@postion)!=0)BEGINSET @sublen=CHARINDEX(@markStr,@origStr,@postion)-@postion; ENDELSEBEGINSET @sublen=@strlen-@postion+1;ENDIF(@postion<=@strlen)BEGINSET @TEMPid=@TEMPid+1;SET @TEMPstr=SUBSTRING(@origStr,@postion,@sublen); INSERT INTO @splittable(str_id,string)values(@TEMPid,@TEMPstr)IF(CHARINDEX(@markStr,@origStr,@postion)!=0)BEGINSET @postion=CHARINDEX(@markStr,@origStr,@postion)+1ENDELSEBEGINSET @postion=@postion+1ENDENDENDRETURNEND⽅法⼆create function dbo.fn_split(@inputstr varchar(8000),@seprator varchar(10))returns @temp table (a varchar(200))asbegindeclare @i intset @inputstr = rtrim(ltrim(@inputstr))set @i = charindex(@seprator, @inputstr)while @i >= 1begininsert @temp values(left(@inputstr, @i - 1))set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)set @i = charindex(@seprator, @inputstr)endif @inputstr <> ''insert @temp values(@inputstr)returnendgo--调⽤declare @s varchar(1000)set @s='Sa1,Sb1,Sc'select * from dbo.fn_split(@s,',')drop function dbo.fn_splitsqlserver中实现split分割字符串函数。

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

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

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 col='''+ replace(@s,',',''' union all select ''')+''''PRINT @sqlexec (@sql)if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GO--⽅法1:循环截取法CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGINDECLARE @splitlen intSET @splitlen=LEN(@split+'a')-2WHILE CHARINDEX(@split,@s)>0BEGININSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')ENDINSERT @re VALUES(@s)RETURNENDGOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GO--⽅法2:使⽤临时性分拆辅助表法CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGIN--创建分拆处理的辅助表(⽤户定义函数中只能操作表变量)DECLARE @t TABLE(ID int IDENTITY,b bit)INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns bINSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)FROM @tWHERE ID<=LEN(@s+'a')AND CHARINDEX(@split,@split+@s,ID)=IDRETURNENDGOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1) drop table [dbo].[tb_splitSTR]GO--⽅法3:使⽤永久性分拆辅助表法--字符串分拆辅助表SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTRFROM syscolumns a,syscolumns bGO--字符串分拆处理函数CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS TABLEASRETURN(SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100)) FROM tb_splitSTRWHERE ID<=LEN(@s+'a')AND CHARINDEX(@split,@split+@s,ID)=ID)GO--⽅法4:利⽤sql server2005的OUTER APPLYCREATE FUNCTION [dbo].[ufn_SplitStringToTable](@str VARCHAR(MAX) ,@split VARCHAR(10))RETURNS TABLEASRETURN( SELECT B.idFROM ( SELECT [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>') + '</v>')) AOUTER APPLY ( SELECT id = N.v.value('.' , 'varchar(100)')FROM A.[value].nodes('/v') N ( v )) B)备注说明:⽅法4必须在sql server2005下才可以运⾏。

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

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))ASBEGINDECLARE@CurrentIndex int;DECLARE@NextIndex int;DECLARE@ReturnText nvarchar(max);SELECT@CurrentIndex=1;WHILE(@CurrentIndex<=len(@SplitString))BEGINSELECT@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);IF(@NextIndex=0OR@NextIndex IS NULL)SELECT@NextIndex=len(@SplitString)+1;SELECT@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);INSERT INTO@SplitStringsTable([value]) VALUES(@ReturnText);SELECT@CurrentIndex=@NextIndex+1;ENDRETURN;END--使⽤⽰例select*FROm dbo.F_Split('111,b2222,323232,32d,e,323232f,g3222', ',')结果为id value-------- ---------------------------------------1 1112 b22223 3232324 32d5 e6 323232f7 g3222=========================================================================⼆、F_SplitLength:获取分割后的字符数组的长度Create function[dbo].[F_SplitLength](@String nvarchar(max), --要分割的字符串@Split nvarchar(10) --分隔符号)returns intasbegindeclare@location intdeclare@start intdeclare@length intset@String=ltrim(rtrim(@String))set@location=charindex(@split,@String)set@length=1while@location<>0beginset@start=@location+1set@location=charindex(@split,@String,@start)set@length=@length+1endreturn@lengthend--调⽤⽰例select dbo.F_SplitLength('111,b2222,323232,32d,e,323232f,g3222',',')结果为7。

SQLServer字符串切割函数是什么

SQLServer字符串切割函数是什么

END
GO
--调用
DECLARE @value VARCHAR(max)
SET
@vBySplit(&#39;645002*01_45854_183677_12&#39;,0,&#39;_&#39;)
PRINT @value
结果:
645002*01
--1
SQLServer 字符串切割函数是什么
大家知道 SQLServer 字符串切割函数吗?创建用户定义函数,它是返回值 的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系 统函数一样,用户定义函数可以从查询中唤醒调用。 也可以像存储过程一样,通过 EXECUTE 语句执行 复制代码代码如下: CREATE FUNCTION fGetStrBySplit ( @Source VARCHAR(max), @Index INT, @SplitChar VARCHAR(1) ) RETURNS varchar(MAX) AS BEGIN DECLARE @Len INT DECLARE @n INT = 0 DECLARE @ChIndex INT DECLARE @Result VARCHAR(MAX) --获取总长度 SET @Len = LEN(@Source)
END
SET @Source = SUBSTRING(@Source,@ChIndex+1,@Len)
SET @ChIndex = CHARINDEX(@SplitChar,@Source)
SET @Len = LEN(@Source)
SET @n = @n + 1
END
RETURN @Source

sqlserve语句 拆分分隔符

sqlserve语句 拆分分隔符

sqlserve语句拆分分隔符拆分分隔符是在SQL Server中用于将字符串拆分成多个部分的一种常用操作。

在本文中,我们将列举出10个常用的SQL Server语句来实现拆分分隔符的功能。

1. 使用CHARINDEX和SUBSTRING函数拆分分隔符:```DECLARE @str VARCHAR(MAX) = 'apple,orange,banana' DECLARE @delimiter CHAR(1) = ','SELECT SUBSTRING(@str, 1, CHARINDEX(@delimiter, @str) - 1) AS Part1,SUBSTRING(@str, CHARINDEX(@delimiter, @str) + 1, LEN(@str) - CHARINDEX(@delimiter, @str)) AS Part2```以上语句将会输出字符串`apple` 和`orange,banana`,分别是原始字符串中第一个分隔符之前的部分和第一个分隔符之后的部分。

2. 使用XML节点和CROSS APPLY拆分分隔符:```DECLARE @str VARCHAR(MAX) = 'apple,orange,banana' DECLARE @delimiter CHAR(1) = ','SELECT Split.a.value('.', 'VARCHAR(100)') AS PartFROM (SELECT CAST('<M>' + REPLACE(@str, @delimiter, '</M><M>') + '</M>' AS XML) AS String) AS ACROSS APPLY String.nodes('/M') AS Split(a)```以上语句将会输出字符串`apple`,`orange` 和`banana`,分别是原始字符串中按照分隔符拆分后的各个部分。

SQLServer中的切割字符串SplitString函数

SQLServer中的切割字符串SplitString函数

SQLServer中的切割字符串SplitString函数SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO/*by kudychen 2011-9-28*/CREATE function [dbo].[SplitString](@Input nvarchar(max), --input string to be separated@Separator nvarchar(max)=',', --a string that delimit the substrings in the input string@RemoveEmptyEntries bit=1 --the return value does not include array elements that contain an empty string )returns @TABLE table([Id] int identity(1,1),[Value] nvarchar(max))asbegindeclare @Index int, @Entry nvarchar(max)set @Index = charindex(@Separator,@Input)while (@Index>0)beginset @Entry=ltrim(rtrim(substring(@Input, 1, @Index-1)))if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1and @Entry<>'')begininsert into @TABLE([Value]) Values(@Entry)endset @Input = substring(@Input, @Index+datalength(@Separator)/2, len(@Input))set @Index = charindex(@Separator, @Input)endset @Entry=ltrim(rtrim(@Input))if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>'')begininsert into @TABLE([Value]) Values(@Entry)endreturnend如何使用:复制代码代码如下:declare @str1 varchar(max), @str2 varchar(max), @str3 varchar(max)set @str1 = '1,2,3'set @str2 = '1###2###3'set @str3 = '1###2###3###'select [Value] from [dbo].[SplitString](@str1, ',', 1)select [Value] from [dbo].[SplitString](@str2, '###', 1)select [Value] from [dbo].[SplitString](@str3, '###', 0)执行结果:里面还有个自增的[Id]字段哦,在某些情况下有可能会用上的,例如根据Id来保存排序等等。

sqlserver中将一个字段根据某个字符拆分成多个字段显示

sqlserver中将一个字段根据某个字符拆分成多个字段显示

sqlserver中将⼀个字段根据某个字符拆分成多个字段显⽰sql server 数据库中某张表(Person)的数据信息是:ID Address1平⼭花园-4单元-12幢-2032⾹⼭花园-3单元-22幢-304现在有需求是,将地址信息显⽰形式改成4列,即⼩区名,单元号,楼房号,房间号分成4列进⾏显⽰ID⼩区名单元号楼房号房间号1平⼭花园4单元12幢2032⾹⼭花园3单元22幢304介绍两种⽅案:第⼀种:最简单的办法就是调⽤sql server中⾃带函数PARSENAME来进⾏拆分,但是注意:最多只能拆分成4个字段。

针对这个例⼦的实现:parsename默认是根据'.'进⾏拆分的,所以⾸先要做的是将字段中的‘-’替换成'.'SELECT Address, PARSENAME(REPLACE([Address],'-','.'),4) as ⼩区名,--如果字段的内容是 4单元-12幢-203 那么此时⼩区名字段的信息就是NULLPARSENAME(REPLACE([Address],'-','.'),3) as 单元号,PARSENAME(REPLACE([Address],'-','.'),2) as 楼房号,PARSENAME(REPLACE([Address],'-','.'),1) as 房间号FROM PersonPARSENAME详解:PARSENAME ( 'object_name' , object_piece )'object_name'要检索其指定部分的对象的名称。

object_name的数据类型为 sysname。

此参数是可选的限定对象名称。

如果对象名称的所有部分都是限定的,则此名称可包含四部分:服务器名称、数据库名称、所有者名称以及对象名称。

sqlserver字符串拆分

sqlserver字符串拆分
sqlserver字 符 串 拆 分
最近项目调取存储的时候直接传入string 作为in的查询范围,结果报错了,深思之后才发现,数据库对于传进来的String,并不是我们想的直 接可以作为参数,而是作为一个整体,而in是需要一个类似array或者list的参数,为此,需要一个拆分string的sql 函数,还好之前的前辈留
20 END
21 RETURN
22 END
23 GO
应该写的很清晰了,就不细说了,欢迎大家指导
7 AS
8 BEGIN
9 DECLARE @i INT
10 SET @SourceStr = RTRIM(LTRIM(@SourceStr))--去除空格
11 SET @i=CHARINDEX(@SeprateStr,@SourceStr)
12 WHILE @i>=1
微修改一下就可以了,下面来看看这个函数
1 FUNCTION f_split
2(
3 -- Add the parameters for the function here
4 @SourceStr VARCHAR(max),@SeprateStr VARCHAR(10)
5)
6 RETURNS @temp TABLE (a VARCHAR(1000))
最近项目调取存储的时候直接传入string作为in的查询范围结果报错了深思之后才发现数据库对于传进来的string并不是我们想的直接可以作为参数而是作为一个整体而in是需要一个类似array或者list的参数为此需要一个拆分string的sql函数还好之前的前辈留下了可以用的稍微修改一下就可以了下面来看看这个函数
15
(a)
16 VALUES ( LEFT(@SourceStr,@i-1) -- a - varchar(1000)

sqlserver拆分字符串函数

sqlserver拆分字符串函数

在SQL Server 中,可以使用多种函数来拆分字符串,其中最常用的函数是STRING_SPLIT 和SUBSTRING 函数。

1. STRING_SPLIT 函数STRING_SPLIT 函数可以将一个字符串按照指定的分隔符拆分成多个子字符串,并返回一个包含所有子字符串的临时表。

其语法如下:STRING_SPLIT (string, separator)其中,string 是要拆分的字符串,separator 是分隔符。

该函数可以用于SQL Server 2016 及以上版本。

例如,下面的代码将一个逗号分隔的字符串拆分成多个子字符串:SELECT value FROM STRING_SPLIT('apple,banana,orange', ',')该代码会返回一个包含三个子字符串的结果集,分别为'apple'、'banana' 和'orange'。

2. SUBSTRING 函数SUBSTRING 函数可以截取一个字符串的一部分,其语法如下:SUBSTRING (string, start, length)其中,string 是要截取的字符串,start 是截取的起始位置,length 是截取的长度。

该函数可以用于SQL Server 2014 及以上版本。

例如,下面的代码将一个字符串的前两个字符截取出来:SELECT SUBSTRING('hello', 1, 2)该代码会返回一个包含两个字符的结果集,即'he'。

需要注意的是,如果start 参数大于字符串的长度,则SUBSTRING 函数会返回一个空字符串。

如果start 和length 参数同时指定,则截取的子字符串长度不能超过字符串的长度。

自己动手写SQL字符串分解函数Split

自己动手写SQL字符串分解函数Split

自己动手写SQL字符串分解函数Split
前段时间,在做一个可以批量审核或删除数据的功能时,遇到这么个问题:
因为审核或删除操作是在存储过程进行的,所以,就打算将选中的数据的主键拼成字符串,传到存储过程进行分离,再继续处理。

C#中和JavaScript中都有相应的分离字符串的Split函数,就想当然的以为SQL中也会有类似的函数,结果查了
半天的MSSQL帮助文档,也没找到。

没办法,只好自己写了,在网上搜了下相关的,看了一两篇关于SQL分离字符串的自定义函数的文章,结果,有
点失望,可能是自己水平差,或者是因为人家的代码没写注释吧,总之就是看着挺吃力的,还没看完就决定自己写了。

思路很简单:在需要分解的字符串中,如果存在指定的分隔符,则将第一个分隔符前面的字符串取出,存入表内,然后在需要分解的字符串中将已取出的字符串及第一个分
隔符删除,然后继续下一次分解(如果还存在指定的分隔符,就分解)
以下是SQL:
按Ctrl+C 复制代码
按Ctrl+C 复制代码
(分隔符允许是多位的)
按一般的习惯来说,在组织多个字符串时,一般都是这种写法:strKeys += strSingleKey + ",";
所以可能最终该字符串可能会以逗号结尾,如果组织完成后,将结尾的逗号去掉了,那就不会以逗号结尾,所以,在循环分解完成后,如果剩下的原字符串中(去除左右空格后),如果还有内容,则也应该存入表中。

可能我这种写法不是最好的,也可能会有问题,如确实有需要改进的,还请指出,不胜感激!!!。

SQLSERVER字符串函数STRING_SPLIT()

SQLSERVER字符串函数STRING_SPLIT()

value hello world SQLSERVER字符串函数STRING_SPLIT()定义:STRING_SPLIT()函数根据指定的分隔符将字符串拆分为⼦字符串⾏。

※STRING_SPLIT 要求兼容性级别⾄少为 130。

(即SSMS 2016及以上版本)※级别低于 130 时,SQL Server 找不到 STRING_SPLIT 函数。

※若要更改数据库的兼容性级别,请参阅。

语法:STRING_SPLIT ( string , separator )参数:string:任何字符类型(例如 nvarchar、varchar、nchar 或 char)的表达式。

separator:任何字符类型(例如 nvarchar(1)、varchar(1)、nchar(1) 或 char(1))的单字符表达式,⽤作串联⼦字符串的分隔符。

返回值:返回⼦字符串的单列的表(table)。

该列名为“value”。

如果任何输⼊参数为 nvarchar 或 nchar,则返回 nvarchar。

否则,返回 varchar。

返回类型的长度与字符串参数的长度相同。

输出⾏可以按任意顺序排列。

顺序不保证与输⼊字符串中的⼦字符串顺序匹配。

可以通过在 SELECT 语句中使⽤ ORDER BY ⼦句覆盖最终排序顺序 (ORDER BY value)。

当输⼊字符串包含两个或多个连续出现的分隔符字符时,将出现长度为零的空⼦字符串。

空⼦字符串的处理⽅式与普通⼦字符串相同。

可以通过使⽤ WHERE ⼦句筛选出包含空的⼦字符串的任何⾏ (WHERE value <> '')。

如果输⼊字符串为 NULL,则 STRING_SPLIT 表值函数返回⼀个空表。

例:SELECT value FROM string_split('hello world',' ')结果:参考原⽂地址:声明:本⽂是本⼈查阅⽹上及书籍等各种资料,再加上⾃⼰的实际测试总结⽽来,仅供学习交流⽤,请勿使⽤于商业⽤途,任何由此产⽣的法律版权问题概不负责,谢谢。

SQLSERVER表值函数--将字符串按分隔符拆分成表

SQLSERVER表值函数--将字符串按分隔符拆分成表

SQLSERVER表值函数--将字符串按分隔符拆分成表SQLSERVER表值函数--将字符串按分隔符拆分成表输⼊:字符串 = 'DADA,RERDE,FRED'输出:表:实现函数代码:-- 已下两种函数可任选⼀个-- 函数写法1:CREATE FUNCTION [dbo].[SplitTextToTable](@SplitString varchar(8000),@Separator varchar(10) = ',')RETURNS @SplitStringsTable TABLE([VALUE] varchar(1000))ASBEGINDECLARE @CurrentIndex int;DECLARE @NextIndex int;DECLARE @ReturnText varchar(8000);SELECT @CurrentIndex=1;WHILE @CurrentIndex<=len(@SplitString)BEGINSET @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);IF @NextIndex=0 OR @NextIndex IS NULLSET @NextIndex=len(@SplitString)+1;SET @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);INSERT INTO @SplitStringsTable([VALUE]) VALUES(@ReturnText);SET @CurrentIndex=@NextIndex+1;ENDRETURN;ENDGO--函数写法2:CREATE FUNCTION dbo.SplitStringToTable(@SplitString varchar(8000),@Separator varchar(10) = ',')RETURNS @SplitStringsTable TABLE([VALUE] varchar(1000))ASBEGINDECLARE @CurrentIndex INT=1DECLARE @SeparatorIndex INT =1SET @SeparatorIndex = CHARINDEX(@Separator, @SplitString, @CurrentIndex)WHILE @SeparatorIndex>0BEGININSERT INTO @SplitStringsTable([VALUE])SELECT SUBSTRING(@SplitString,@CurrentIndex, @SeparatorIndex-@CurrentIndex)SET @CurrentIndex = @SeparatorIndex+1SET @SeparatorIndex = CHARINDEX(@Separator, @SplitString, @CurrentIndex)--SELECT @SeparatorIndex, @CurrentIndexENDINSERT INTO @SplitStringsTable([VALUE])SELECT SUBSTRING(@SplitString,@CurrentIndex, LEN(@SplitString)-@CurrentIndex+1)RETURNENDGO--验证:两个函数输出应⼀样DECLARE @SplitString VARCHAR(100)= 'DADA,RERDE,FRED'SELECT * FROM dbo.SplitTextToTable(@SplitString,',')SELECT * FROM dbo.SplitStringToTable(@SplitString, ',')有时对输出表进⾏处理时,需要⽤到字符串的出现顺序,这种情况下有必要给输出表加⼀个序号列(见下图),有两种解决⽅案:-- ⽅法1:使⽤ROW_NUMBER()函数SELECT ROW_NUMBER() OVER(ORDER BY AA) RN, A.[VALUE]FROM (-- 因为ROW_NUMBER()必须要依据⼀个字段来排序,因此增加⼀个0作为排序字段SELECT 0 AS AA,* FROM dbo.SplitTextToTable(@SplitString, ',')) A-- ⽅法2:修改函数,输出中加SNO列(修改SplitStringToTable或SplitTextToTable都可以)ALTER FUNCTION dbo.SplitStringToTable(@SplitString varchar(8000),@Separator varchar(10) = ',')RETURNS @SplitStringsTable TABLE([SNO] INT IDENTITY(1,1), --顺序号[VALUE] varchar(1000))ASBEGINDECLARE @CurrentIndex INT=1DECLARE @SeparatorIndex INT =1SET @SeparatorIndex = CHARINDEX(@Separator, @SplitString, @CurrentIndex)WHILE @SeparatorIndex>0BEGININSERT INTO @SplitStringsTable([VALUE])SELECT SUBSTRING(@SplitString,@CurrentIndex, @SeparatorIndex-@CurrentIndex)SET @CurrentIndex = @SeparatorIndex+1SET @SeparatorIndex = CHARINDEX(@Separator, @SplitString, @CurrentIndex)--SELECT @SeparatorIndex, @CurrentIndexENDINSERT INTO @SplitStringsTable([VALUE])SELECT SUBSTRING(@SplitString,@CurrentIndex, LEN(@SplitString)-@CurrentIndex+1)RETURNENDGO。

SQLServer实现split函数分割字符串功能及用法示例

SQLServer实现split函数分割字符串功能及用法示例
这篇文章主要介绍了sqlserver实现split函数分割字符串功能及用法结合实例形式分析了sqlserver实现split分割字符串的相关技巧与使用方法需要的朋友可以参考下
SQLServer实现 split函数分割字符串功能及用法示例
本文实例讲述了SQL Server实现split函数分割字符串功能及用法。分享给大家供大家FROM f_SplitToNvarchar('1,2,3,4',',');
如图所示:
希望本文所述对大家SQL Server数据库程序设计有所帮助。
/* 函数名称:f_SplitToNvarchar 作用:实现split功能的函数 更新记录: 设计思路:将nvarchar类型字符结合的一个串,分隔到一张只有一列nvarchar类型的表里 */ CREATE FUNCTION [dbo].[f_SplitToNvarchar] ( @SourceSql NVARCHAR(MAX),--源分隔字符串 @StrSeprate VARCHAR(10)--分隔符 ) RETURNS @temp TABLE(col NVARCHAR(MAX)) AS BEGIN DECLARE @i INT SET @SourceSql = RTRIM(LTRIM(@SourceSql)) SET @i = CHARINDEX(@StrSeprate, @SourceSql) WHILE @i >= 1 BEGIN
INSERT @temp VALUES (
LEFT(@SourceSql, @i -1) ) SET @SourceSql = SUBSTRING(@SourceSql, @i + 1, LEN(@SourceSql) -@i) SET @i = CHARINDEX(@StrSeprate, @SourceSql) END IF @SourceSql <> '\' INSERT @temp VALUES ( @SourceSql ) RETURN END GO

SQLServer字符串分割函数Split

SQLServer字符串分割函数Split

SQLServer字符串分割函数Split 1USE[QuickFrame_FIQS];2GO3/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2018/8/14 16:41:04 ******/4SET ANSI_NULLS ON;5GO6SET QUOTED_IDENTIFIER ON;7GO89--功能:字符串分割函数10--描述:返回分割后的数据表记录11--编制⼈:Denghejing12--编制时间:2018.08.141314/*15--因为这个函数创建的时候默认为以逗号分割,所以只需要使⽤ default 关键字就可以了16select * from Split(default,'123,456,789')17select * from Split(default,'123,456,789,')1819--其它字符分割20select * from Split('abc','11111abc22222abc33333')21select * from Split('abc','11111abc22222abc33333abc')22*/2324ALTER FUNCTION[dbo].[Split]25 (26@separator VARCHAR(64) =',',27@string NVARCHAR(MAX)28 )29RETURNS@ResultTab TABLE30 (31 Id INT,32 Result NVARCHAR(500)33 )34AS35BEGIN36DECLARE@Num INT;3738IF (@string IS NOT NULL AND@string<>''AND LEN(@string) >0)39BEGIN40IF (CHARINDEX(@separator, @string) >0) --判断要截取的字符是否存在41BEGIN42SET@Num=0;43WHILE (CHARINDEX(@separator, @string) >0) --如果要截取的字符存在,就继续循环44BEGIN45SET@Num=@Num+1;46INSERT INTO@ResultTab47 (48 Id,49 Result50 ) --截取字符串,插⼊表变量51SELECT@Num,52LEFT(@string, CHARINDEX(@separator, @string) -1);5354--把已经截取并插⼊的字符串删除55SET@string=STUFF(@string, 1, CHARINDEX(@separator, @string) -1+LEN(@separator), '');56END;5758--如果最后⼀个截取的字符串为空,那就不插⼊了59--例如:'123,456,789,' 这样的字符串最后剩下的就是空字符串了60IF (@string IS NOT NULL AND@string<>'')61BEGIN62INSERT INTO@ResultTab63 (64 Id,65 Result66 )67SELECT@Num+1,68@string;69END;70END;71ELSE72BEGIN73DELETE FROM@ResultTab;74END;75END;76ELSE77BEGIN78DELETE FROM@ResultTab;79END;80RETURN;81END;最终执⾏结果集:。

SQLServer用户自定义函数

SQLServer用户自定义函数

SQLServer⽤户⾃定义函数分为表值函数(返回Table类型的表数据)和标量值函数(返回某个数据类型的某个值)标量值函数语法:【内可省略】create function 【[dbo].】函数名(【参数……】)returns 数据类型asbeginreturn 要返回的值end⽰例:--返回分隔字符串左⾯部分CREATE FUNCTION[dbo].[fn_leftFirst](@source nvarchar(max), @split nvarchar(1000))RETURNS nvarchar(max)ASBEGINif(CHARINDEX(@split, @source)>0)BEGINreturn left(@source,CHARINDEX(@split, @source)-LEN(@split)+1)ENDreturn@sourceEND调⽤:select[dbo].fn_leftFirst('123456789','34');返回:12。

注意上述[dbo].不能省略。

否则会报'fn_leftFirst' 不是可以识别的函数名称。

(多语句)表值函数语法1:create function 【[dbo].】函数名(【参数……】)returns @table TABLE(列名1 列名1类型,……)asbegininsert into @table values(值1,……);returns @tableend⽰例:--分隔字符串CREATE FUNCTION[dbo].[f_splitSTR](@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS@re TABLE(col varchar(max))ASBEGINDECLARE@splitlen int-- 取分隔符的长度, 在分隔符后⾯加⼀个字符是为了避免分隔符以空格结束时, 取不到正确的长度SET@splitlen=LEN(@split+'a') -2-- 如果待分拆的字符串中存在数据分隔符, 则循环取出每个数据项WHILE CHARINDEX(@split, @s)>0BEGIN-- 取第⼀个数据分隔符前的数据项INSERT@re VALUES(LEFT(@s, CHARINDEX(@split, @s) -1))-- 将已经取出的第⼀个数据项和数据分隔符从待分拆的字符串中去掉SET@s=STUFF(@s, 1, CHARINDEX(@split, @s) +@splitlen, '')END-- 保存最后⼀个数据项(最后⼀个数据项后⾯没有数据分隔符, 故在前⾯的循环中不会被处理)INSERT@re VALUES(@s)RETURNend(内联)create function 【[dbo].】函数名(【参数……】)returns TABLE(列名1 列名1类型,……)asbeginreturn(select **** )end⽰例:CREATE FUNCTION[GetMoreThanSalary](@salary int)RETURNS TABLEASRETURN(SELECT[FName],[FCity],[FAge],[FSalary]FROM[Demo].[dbo].[T_Person]Where[FSalary]>@salary )GO。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Sp lit函数,所以我们只能自己动手来解决一下。

为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作。

当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了......
1.当我们需要传入很长的字符串是我们可以借助NText和Text类型,他们的区别是一个是支持Unicode,一个是支持ANSI字符集的。

需要注意的是当我们要计算字符串长度时我们需要用到DATALENGTH()而不是LEN(),在NText类型中一个字符占两个字节,所以在计算字符时别忘了除以2,下面我们先看下例子就能够说明一切了。

--=============================================
--Author: <myxbing>
-- Createdate: <2007/8/17>
--Description: <拆分字符串函数>
--=============================================
CREATE FUNCTION[dbo].[Split]
(
@SplitStringtext, -- 如果要传入NText类型,下面需要相应的修改,注释行为NText下同
@Separatorvarchar(2)= ','-- NVarChar(2) = N','
)
RETURNS@SplitStringsTableTABLE
(
[id]intidentity(1,1),
[value]varchar(8000) -- NVarChar(4000)
)
AS
BEGIN
DECLARE@CurrentIndexint;
DECLARE@NextIndexint;
DECLARE@ReturnTextvarchar(8000);-- NVarChar(4000)
SELECT@CurrentIndex=1;
WHILE(@CurrentIndex<=datalength(@SplitString))-- DATALENGTH(@SplitString)/2 BEGIN
SELECT@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0OR@NextIndexISNULL)
SELECT@NextIndex=datalength(@SplitString)+1;--DATALENGTH(@SplitStri ng)/2
SELECT@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@Curr entIndex);
INSERTINTO@SplitStringsTable([value])
VALUES(@ReturnText);
SELECT@CurrentIndex=@NextIndex+1;
END
RETURN;
END
有时我们拆分出来还是需要很长的字符串有可能超过(N)VarChar的长度,当然为了兼容SQL Server2000不能用max,所以我们拆出的字符串还是要用(N)Text来表示,需要注意的是在局部变量中不能定义(N)Text的类型,不过我们可以把substring出来的字符串直接加入到表变量中,而不要付值后在Insert。

2.当我们传入的(N)VarChar时,我们可以用LEN来计算长度,值得注意的是NVarChar 的最大长度是4000,而VarChar的最大长度是8000。

下面我们来看一下代码,和上面的代码基本没什么差别。

=====================
--Author: <myxbing>
--Createdate: <2007/8/18>
-- Description: <拆分字符串函数>
--=============================================
CREATE FUNCTION[dbo].[Split]
(
@SplitString varchar(8000),-- nvarchar(4000)
@Separatorvarchar(2)=','
)
RETURNS@SplitStringsTableTABLE
(
[id]intidentity(1,1),
[value]varchar(8000)-- nvarchar(4000)
)
AS
BEGIN
DECLARE@CurrentIndexint;
DECLARE@NextIndexint;
DECLARE@ReturnTextvarchar(8000);-- nvarchar(4000)
SELECT@CurrentIndex=1;
WHILE(@CurrentIndex<=len(@SplitString))
BEGIN
SELECT@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0OR@NextIndexISNULL)
SELECT@NextIndex=len(@SplitString)+1;
SELECT@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@Curr entIndex);
INSERTINTO@SplitStringsTable([value])
VALUES(@ReturnText);
SELECT@CurrentIndex=@NextIndex+1;
END
RETURN;
END
3.拆分字符串,得到int类型的数据,这个比较简单,代码和上面的差不多这里就不给出了,可以根据上面的代码自己改写。

由于数据库中没有数组,所以只能用表变量返回,所以当你定义这些函数时要定义表值函数。

OK有了这些函数我们就可以很好的利用他们来为我们的更有效的批量操作。

当然由于变量都是考虑到溢出而设置的,肯能这样会给性能上带来一定的影响,但是编译后可能也可以给我们带来不少的效果,请大家慎用之。

相关文档
最新文档