以前復制的創建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: