微軟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
