SQL Server中自定义函数:用指定的分隔符号分割字符串

2014-11-13

  微软SQL Server数据库中包含了很多内置的函数,入下图:

它们用于处理日期、数学、元数据、字符串等。

  其中最为常用的就是处理字符串,里面包含了CharIndex()等函数,非常方便使用。

但是对于 特殊字符串的处理,比如:ISBN号 ‘978-7-5007-7234-7‘,如果想获取第三个与第四个分割符号之间的数字,

那么SQL 内置函数无法直接做到。这时就需要自定义函数。下面自定义三个函数,用于处理特殊的字符串。

  一、按指定符号分割字符串,返回分割后的元素个数

 1 ALTER FUNCTION [dbo].[Fun_GetStrArrayLength]
 2 (
 3     @originalStr VARCHAR(1024),    --要分割的字符串
 4     @split       VARCHAR(10) --分隔符号
 5 )
 6 RETURNS INT
 7 AS
 8 BEGIN
 9     DECLARE @location INT;--定义起始位置
10     DECLARE @start INT; --定义从第几个开始
11     DECLARE @length INT;--定义变量,用于接收计算元素的个数
12
13     SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右两侧的空格
14
15     SET @location = CHARINDEX(@split, @originalStr); --分割符号在字符串中第一次出现的位置(索引从1开始计数)
16
17     SET @length = 1;
18
19     WHILE @location <> 0
20     BEGIN
21         SET @start = @location + 1;
22         SET @location = CHARINDEX(@split, @originalStr, @start);
23         SET @length = @length + 1;
24     END
25     RETURN @length;
26 END

调用函数:select dbo.Fun_GetStrArrayLength(‘978-7-5007-7234-7‘,‘-‘)

结果:5

  二、按指定符号分割字符串,返回分割后指定索引的第几个元素,像数组一样方便

 1 ALTER FUNCTION [dbo].[Fun_GetStrArrayStrOfIndex]
 2 (
 3     @originalStr     VARCHAR(1024),    --要分割的字符串
 4     @split           VARCHAR(10),    --分隔符号
 5     @index           INT --取第几个元素
 6 )
 7 RETURNS VARCHAR(1024)
 8 AS
 9 BEGIN
10     DECLARE @location INT; --定义第一次出现分隔符号的位置
11     DECLARE @start INT;--定义开始位置
12     DECLARE @next INT; --定义下一个位置
13     DECLARE @seed INT; --定义分割符号的长度
14
15     SET @originalStr = LTRIM(RTRIM(@originalStr));--去除字符串左右2侧空格
16     SET @start = 1;
17     SET @next = 1;
18     SET @seed = LEN(@split);
19
20     SET @location = CHARINDEX(@split, @originalStr);--第一次出现分隔符号的位置
21
22     WHILE @location <> 0
23           AND @index > @next
24     BEGIN
25         SET @start = @location + @seed;
26         SET @location = CHARINDEX(@split, @originalStr, @start);
27         SET @next = @next + 1;
28     END
29
30     IF @location = 0
31         BEGIN
32             SELECT @location = LEN(@originalStr) + 1;
33         END
34
35     --存在两种情况:
36     --1、字符串不存在分隔符号。
37     --2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
38
39     RETURN SUBSTRING(@originalStr, @start, @location -@start);
40 END

  调用函数:select dbo.Fun_GetStrArrayStrOfIndex(‘978-7-5007-7234-7‘,4)

结果:7234

  三、像数组一样遍历字符串中的元素

 1 ALTER FUNCTION [dbo].[Fun_SplitStr]
 2 (
 3     @originalStr      VARCHAR(8000), --要分割的字符串
 4     @split varchar(100)  --分隔符号
 5 )
 6 RETURNS @temp TABLE(Result VARCHAR(100))
 7 AS
 8 BEGIN
 9     DECLARE @result AS VARCHAR(100);   --定义变量用于接收单个结果
10
11     SET @originalStr = @originalStr + @split ;
12
13     WHILE (@originalStr <> ‘‘)
14     BEGIN
15         SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ;
16
17         INSERT @temp VALUES(@result) ;
18
19         --STUFF()函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符。
20         SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), ‘‘);
21     END
22     RETURN
23 END   

  调用示例:select * from dbo.Fun_SplitStr(‘978-7-5007-7234-7‘,‘-‘)
    结果: 978

7

5007

7234

7

时间: 2025-01-13 05:23:03

SQL Server中自定义函数:用指定的分隔符号分割字符串的相关文章

SQL Server中getdate()函数的时间格式设置

Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE(), 1): 05/16/06Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06Select

SQL Server中COALESCE函数的用法

在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELECT COALESCE(NULL,NULL,N'A',N'B',N'C',NULL) 结果: 使用COALESCE函数时要注意,其参数必须是相同的类型,例如下面的例子中COALESCE函数的参数中,既有字符串类型又有数字类型,就会报错: SELECT COALESCE(NULL,NULL,N'A',N

Sql Server中常用函数replicate

SQL常用函数之三 REPLICATE () 按指定次数重复字符表达式. 语法 REPLICATE ( character_expression, integer_expression) 参数 character_expression 字符数据型的字母数字表达式,或者可以隐式转换为 nvarchar 或 ntext 的其他数据类型的字母数字表达式. integer_expression 可以隐式转换为 int 的表达式.如果 integer_expression 为负,将返回空字符串. 返回值 

sql server中format函数的yyyyMMddHHmmssffff时间格式兼容旧版sql写法

问题:博主看到项目脚本,有些地方使用了format函数来把当前日期转换成yyyyMMddHHmmssffff的格式,但在测试环境数据库是sql 2008 r2,是不支持format这个函数的.脚本会报错: 'format' 不是可以识别的 内置函数名称. 'format' is not a recognized built-in function name. 解决方案:由于低版本的SQL不支持format,例如sql 2008\2005\2000,需要使用其他方法来代替.博主经过试验,使用了co

SQL Server中Pivot()函数实现动态行转列

一般情况下Pivot()函数中in中只能写死,因为PIVOT()的in中不支持子查询,所以这样的话只能用存储过程来解决: CREATE PROCEDURE InsurancePivot @Foldercode VARCHAR(50), @isY VARCHAR(4) AS BEGIN     DECLARE @ColumnNames VARCHAR(3000) SET @ColumnNames='' SELECT        @ColumnNames = @ColumnNames + '['

SQL Server 中LEN函数的问题

LEN('T ') =1 LEN(' T') =2 在数据库中分解字符串时要注意,例如以'^'分隔'X ^ T ',分解时要注意最后的'T '被分解成'T' 可用如下的代码来进行完整的分解 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE function [dbo].[FnsplitWithEmpty](@SourceStr varchar(8000),@StrSeprate varchar(10)) returns @temp t

Sql Server 中由数字转换为指定长度的字符串

一个列的数据类型是 int ,从 1 开始自动增长,另一个列是字符串,现在想把 int 列转换成 九个字符,比如 1 转换后就是 000000001 ,添到字符串列,怎么实现呢? set @imaxUType=190 select @tmp=right(str(@imaxUType+1000000000),9) select @tmp 结果 Column1 ---------- 000000190 这个方法至多9位高了后MSSQL 转出来的是 *********咯! 期待牛人更好的不限位数的解决

Sql Server中常用的字符串函数

len(expression) 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格. datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格length(expression,variable)指定字符串或变量名称的长度.substring(expression,start,length) 不多说了,取子串right(char_expr,int_expr) 返回字符串右边int_expr个字符concat(str1,str2,...)返回来自于参数连结

SQL Server中如何把 科学记数法字符串 变为 数字字符串

当我们将Excel的数据导入SQL Server时,如果用SQL Server的字符串类型(VARCHAR和NVARCHAR等)来存储从Excel导入的数字,有时候这些数字会变成科学记数法字符串(例如'1.23E+10'实际上是'12300000000'). 这并不是我们想要的结果,我们希望从Excel导入的数字还是数字字符串,而不是科学记数法. 在SQL Server中我们可以通过这个思路来将 科学记数法字符串 变为 数字字符串: 首先将 科学记数法字符串 转换为 FLOAT类型 接着将 FL