SQL SERVER 中的自訂函數(二) 資料表值函式

來源:互聯網
上載者:User

資料表值函式

資料表值函式和純量值函式的不同是 資料表值函式是返回一個Table類型  Table類型相當與一張儲存在記憶體中的一張虛擬表.

資料表值函式的文法:

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 [ ) ]
[ ; ]

 

現在來寫一個比較實用的資料表值函式..

寫一個切割字串的資料表值函式

Code
 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類型   所以可以用下面的文法來調用

 

Code
SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')

得到的結果

 

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

 如果還有什麼不明白可以 留言.....

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.