資料庫中的自定義錶值函式

2022-05-03 14:57:22 字數 2456 閱讀 7962

看到別人寫的函式,一開始看不懂,於是在網上找資料,原來是錶值函式,感覺又學到了,滿滿的充實感,摘錄如下:

錶值函式

錶值函式和標量值函式的不同是 錶值函式是返回乙個table型別  table型別相當與一張儲存在記憶體中的一張虛擬表.

錶值函式的語法:

create function [ schema_name. ] function_name 

( [  

[ ,...n ]])

returns table

[ with [ ,...n ] ]

[ as ]

return [ ( ] select_stmt [ ) ]

[ ; ]

現在來寫乙個比較實用的錶值函式..

寫乙個切割字串的錶值函式

1 --------------------------這個函式用來切割字串的-----------------

2 --函式的引數  第乙個是要切割的字串 第二個是要以什麼字串切割

3 create function split(@text nvarchar(4000),@sign nvarchar(4000))

4 returns  @temptable table(id int identity(1,1) primary key,[value] nvarchar(4000))

5 as

6 begin

7     declare @startindex int                --開始查詢的位置

8     declare @findindex  int                --找到的位置

9     declare @content    varchar(4000)    --找到的值

10     --初始化一些變數

11     set @startindex = 1 --t-sql中字串的查詢位置是從1開始的

12     set @findindex=0

13     

14     --開始迴圈查詢字串逗號

15     while(@startindex <= len(@text))

16     begin

17         --查詢字串函式 charindex  第乙個引數是要找的字串

18         --                            第二個引數是在**查詢這個字串

19         --                            第三個引數是開始查詢的位置

20         --返回值是找到字串的位置

21         select @findindex = charindex(@sign,@text,@startindex)

22         --判斷有沒找到 沒找到返回0

23         if(@findindex =0 or @findindex is null)

24         begin

25             --如果沒有找到者表示找完了

26             set @findindex = len(@text)+1

27         end

28         --擷取字串函式 substring  第乙個引數是要擷取的字串

29         --                            第二個引數是開始的位置

30         --                            第三個引數是擷取的長度

31         --@findindex-@startindex 表示找的的位置-開始找的位置=要擷取的長度

32         --ltrim 和 rtrim 是去除字串左邊和右邊的空格函式

33         set @content = ltrim(rtrim(substring(@text,@startindex,@findindex-@startindex)))

34         --初始化下次查詢的位置

35         set @startindex = @findindex+1

36         --把找的的值插入到要返回的table型別中

37         insert into @temptable ([value]) values (@content) 

38     end

39     return

40 end

這個函式的作用就是類似.net中的string類的split方法

現在來測試這個函式

這個函式返回的是table型別   所以可以用下面的語法來呼叫

select * from dbo.split('a,b,c,d,e,f,g',',')

得到的結果

這個函式還是比較實用的..

原**:

SQLserver 資料庫自定義函式

最近專案開發上使用的sqlserver資料庫是2008版本,由於08版本的資料是沒有字串合併 string agg 這個函式 2017版本及以上支援 的,只有用stuff for xml path 來達到效果。所以才有萌生出了自定義聚合函式的想法。第一步新建專案 2008版本選擇 檔案 新建 專案 ...

在資料庫中自定義外部函式

在oracle中可以使用pl sql來實現一些複雜的功能,同時可以通過自定義的外部函式來實現很多豐富的功能,我們可以基於c c 來寫一些函式,然後把動態鏈結庫放入oracle home中方便直接呼叫。首先這種實現方法需要依賴於資料庫層面的服務extproc,會生成乙個extproc程序,然後專門來處...

自定義mysql資料庫函式 資料庫自定義函式

這個為通用過濾關鍵字的函式,若有其他關鍵字未新增可以參考語法加入。use db go object userdefinedfunction dbo f filterstring script date 12 09 2013 17 03 45 set ansi nulls on go set quot...