以前復制的創建sql函數比較亂,現在將我自己項目中的三種sql函數做下對比,一目了然:
(1)表值函數——方法一:直接創建臨時表,並返回臨時表。優點:函數體中間可以直接申明臨時變量,並做各種邏輯處理,最后只要將需要返回的數據插入臨時表,並return結束語返回就ok了。


(2)表值函數——方法二:直接返回表數據:缺點是:整個函數體中間不能申明臨時變量,只能在一個查詢語句中,做些邏輯處理,太坑了。


(3)標量值函數——方法三:函數直接返回字符串,沒啥可說的,功能太單一,勝在輕便簡單。


一.FUNCTION: 在sqlserver2008中有3中自定義函數:標量函數/內聯表值函數/多語句表值函數,首先總結下他們語法的異同點:
同點:
1.創建定義是一樣的:
a, CREATE FUNCTION F_NAME(傳入的參數名稱 傳入參數的類型)
b,RETURNS 返回值類型
c,AS 異點:
1.標量函數返回的是一個數據類型值,內聯表值函數返回的是一個table,而多語句返回的是一個table的變量(類似前面兩個的結合);
2.語法的結構:標量函數和多語句函數都是要有begin,,,end,內聯表值函數就沒有;
3.調用:標量函數要寫成在dbo,function_name;
標量函數,利用上篇文章寫的數據表,在[T_員工信息]表中查姓名為李異峰員工的工號:
1 USE SQL_SYSTEM
2 GO
3 CREATE FUNCTION F_GONGHAO(@XINGMING NVARCHAR(5))
4 RETURNS INT
5 AS
6 BEGIN
7 DECLARE @GONGHAO INT
8 SET @GONGHAO =(SELECT Y.工號 FROM[T_員工信息] AS Y WHERE Y.姓名 =@XINGMING )
9 RETURN @GONGHAO
10 END
11 GO
12 /*上面是標量函數的一個簡單的例舉,下面就開始調用,注意是在dbo.下*/
13 SELECT [姓名] FROM[T_員工信息] WHERE [姓名]='李異峰' /**對比的查詢*/
14 /*請注意觀察,和對比*/
15 SELECT [姓名],DBO.F_GONGHAO ('李異峰')AS 工號 FROM[T_員工信息] WHERE [姓名]='李異峰'
16 GO
F5下:
內聯表值函數:他返回的可是一個table哦,比如:篩選出2014.2.28號所有員工的打卡記錄:
1 USE SQL_SYSTEM
2 GO
3 CREATE FUNCTION F_DAKAJILU(@RIQI DATE)
4 RETURNS TABLE
5 AS
6 RETURN(
7 SELECT* FROM[T_考勤]AS K WHERE K.日期 =@RIQI
8 )
9 GO
10 /*需要注意的就是他的寫法上沒有begin+end*/
11 /*下面就是將date帶入函數中*/
12 SELECT*
13 FROM [F_DAKAJILU]('2014/02/28')
14 GO
F5:
多語句表值函數就是,表值函數+內聯表值函數綜合版:就寫個返回當天打卡記錄和涉及員工的個人信息:
1 USE SQL_SYSTEM
2 GO
3 CREATE FUNCTION F_D_DAKAJILU(@RIQI DATE)
4 RETURNS @TEMP_TABLE TABLE( /*這里要注意的就是既然是多語句的話,那你就要告訴計算機你要查詢的列是哪些*/
5 [姓名]NVARCHAR(5) NOT NULL,
6 [工號]INT NOT NULL,
7 [職位]NVARCHAR(10) NOT NULL,
8 [部門]NVARCHAR(5) NOT NULL,
9 [是否夜班]NCHAR(1) NOT NULL,
10 [日期]DATE NOT NULL,
11 [當天上班時間]FLOAT(1)NOT NULL
12 )
13 /*以上就是要告訴計算機你要的一個基本信息列*/
14 AS
15 BEGIN
16 INSERT INTO @TEMP_TABLE /*這句的意思是將下面的查詢結果插入到@TEMP_TABLE變量中去*/
17 SELECT Y.姓名 ,Y.工號 ,Y.職位 ,Y.部門 ,K.夜班 ,K.日期 ,K.當天上班時間
18 FROM[T_員工信息] AS Y CROSS JOIN [T_考勤] AS K /*這里我用的是交叉連接*/
19 WHERE Y.工號 =K.工號 AND K.日期=@RIQI
20 RETURN
21 END
22 GO
23 SELECT*
24 FROM[F_D_DAKAJILU]('2014/02/28')
25 GO
F5:

