Sql函數的三種寫法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM