在公司用云平臺做開發就是麻煩 ,做了很多功能或者有些收獲,都沒辦法寫博客,結果回家了自己要把大腦里面記住的寫出來。
split()這個函數我們并不陌生,但是當前臺有許多字段然后隨意勾選后的這些參數傳遞到后臺做處理的時候卻麻煩了,我們這個時候需要把這些當字符串傳遞到存儲過程,在存儲過程里面將這些字符串分割成一個個單獨的個體,我這里不說數組,是因為存儲過程沒有數組這一說。
這時候我們就會想到表值函數。表值函數返回的是一個Table類型的表。說到這里我想很多人都想到了,這不就是一個數組形式么?一個表就是一個數組,每一行就是一個數組中的值,但是里面的值怎么遍歷或者取出來呢?我想我們可以用游標的形式去遍歷出來。
之前我做過一個gompertz的算法模型,將VBA寫的算法,全部用存儲過程寫出來,里面涉及到很多的一位數組,二維數組。我就是用一個個虛擬表寫的。
現在我們言歸正傳!
這里我們先不管內聯表值函數還是多語句表值函數。
//語法結構,函數體由一條return語句組成,最后調用的時候跟查表一樣CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] } [ ,...n ] ])RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ][ ; ]
這樣比較抽象,現在來個具體的使用的函數。
CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000)) RETURNS @tempTable TABLE(id INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000)) AS BEGIN DECLARE @StartIndex INT --開始查找的位置 DECLARE @FindIndex INT --找到的位置 DECLARE @Content VARCHAR(4000) --找到的值 SET @StartIndex = 1 SET @FindIndex=0 --開始循環查找字符串逗號 WHILE(@StartIndex <= LEN(@Text)) BEGIN SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex) IF(@FindIndex =0 OR @FindIndex IS NULL) BEGIN --如果沒有找到者表示找完了 SET @FindIndex = LEN(@Text)+1 END SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex))) --初始化下次查找的位置 SET @StartIndex = @FindIndex+1 --把找的的值插入到要返回的Table類型中 INSERT INTO @tempTable ([VALUE]) VALUES (@Content) END RETURN END -------------------------------------------------------------------SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')
這里面涉及到了5個函數。
第一個:LEN() 這個沒得說的,就是類似JS中的length
第二個:LTRIM() 這個從字符串左側刪除空格或其他預定義字符
第三個:RTRIM()字符串的末端開始刪除空白字符或其他預定義字符
第四個: CHARINDEX(expression1 , expression2 , [ start_location ]) 返回值是 int 這個函數有點意思了,也很重要。
這個函數類似于C#中的StartWith(),IndexWith()等函數。
例子:CustomName包含客戶的First Name和Last Name,它們之間被一個空格隔開。我們用CHARINDX函數確定兩個名字中間空格的位置。通過這個方法,我們可以分析ContactName列的空格位置,這樣可以只顯示這個列的last name部分。
第五個:SUBSTRING(str, pos, len) 這個函數類似JS中的substring()是用來抓出一個欄位資料中的其中一部分/截取字符串的一個方法 。
例子:SELECT SUBSTR (Store_Name, 2, 4)FROM GeographyWHERE Store_Name = 'San Diego';
新聞熱點
疑難解答