1. 程式人生 > >SQL Server 自定義函式(Function)

SQL Server 自定義函式(Function)

sql server 自定義函式分為三種類型:標量函式(Scalar Function)、內嵌表值函式(Inline Function)、多宣告表值函式(Multi-Statement Function)

標量函式:標量函式是對單一值操作,返回單一值。

內嵌表值函式:內嵌表值函式的功能相當於一個引數化的檢視。它返回的是一個表,內聯表值型函式沒有由BEGIN-END 語句括起來的函式體。

多宣告表值函式:它的返回值是一個表,但它和標量型函式一樣有一個用BEGIN-END 語句括起來的函式體,返回值的表中的資料是由函式體中的語句插入的。

它可以進行多次查詢,對資料進行多次篩選與合併,彌補了內聯表值型函式的不足。

建立標量函式的語法:

複製程式碼

1 create function [函式的所有者].函式名(標量引數 [as] 標量引數型別 [=預設值])
2 returns 標量返回值型別
3 [with {Encryption | Schemabinding }]
4 [as]
5 begin
6     函式體(即 Transact-SQL 語句)
7     return 變數/標量表達式
8 end

複製程式碼

下面自定義一個根據傳入引數(即學生性別)來計算學生平均身高的 Function,示例如下:

按 Ctrl+C 複製程式碼

按 Ctrl+C 複製程式碼

執行使用者自定義標量函式:

1 select [函式的所有者].函式名 as 欄位別名
2 
3 select dbo.AvgHeight(default) as AvgHeight;    --返回 179
4 select dbo.AvgHeight('男');     --返回 179
5 select dbo.AvgHeight('女');     --返回 176

PS:建立函式時指定了函式所有者,那麼呼叫的時候也必須指定函式的所有者。(一般都為 dbo)

呼叫自定義函式時如果想不傳入引數而使用預設值,那麼必須使用 default 關鍵字。如果自定義函式的引數沒有預設值,那麼會返回 null。

建立內嵌表值函式語法:

1 create function [函式的所有者].函式名(標量引數 [as] 標量引數型別 [=預設值])
2 returns table
3 [with {Encryption | Schemabinding }]
4 [as]
5 return(單個 SELECT 語句,確定返回的表的資料。)

下面自定義一個根據傳入引數(即學生學號)來查詢學生資訊的 Function,示例如下:

複製程式碼

 1 use Test
 2 go
 3 
 4 create function dbo.SearchStuInfo(@Stu_No varchar(50)='001')
 5 returns table
 6 as
 7 return(
 8 select S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate 
 9 from Student where [email protected]_No)
10 go

複製程式碼

執行使用者自定義內嵌表值函式:

1 select * from dbo.SearchStuInfo(default);    --返回學號為 001 的學生資訊
2 
3 select * from dbo.SearchStuInfo('008');        --返回學號為 008 的學生資訊

建立多宣告表值函式的語法:

複製程式碼

1 create function [函式的所有者].函式名(標量引數 [as] 標量引數型別 [=預設值])
2 returns @表變數 table 表的定義(即列的定義和約束)
3 [with {Encryption | Schemabinding }]
4 [as]
5 begin
6     函式體(即 Transact-SQL 語句)
7     return
8 end

複製程式碼

下面自定義一個根據傳入引數(即學生學號)來查詢學生資訊和課程,並計算出該學生的身高是否大於所有學生的平均身高的 Function,示例如下:

複製程式碼

 1 use Test
 2 go
 3 
 4 create function dbo.SearchStuCou(@StuN varchar(10)='001')
 5 returns @StuInfo table (
 6     StuNo varchar(50) not null primary key,
 7     StuName varchar(10) not null,
 8     StuSex  varchar(10) not null,
 9     StuHeight varchar(10) null,
10     StuAvgHeight decimal(10,2) null,
11     StuConAvgHeight varchar(30) null,
12     StuCou varchar(10) null
13 )
14 as
15 begin
16     declare @Height decimal(10,2)
17     declare @AvgHeight decimal(10,2)
18     declare @ConAvgHeight varchar(30)
19 
20     select @AvgHeight=AVG(Convert(decimal(10,2),S_Height))        --查詢所有同學的平均身高
21     from Student 
22 
23     select @Height=Convert(decimal(10,2),S_Height)        --查詢指定學號的學生身高
24     from Student 
25     where [email protected]
26 
27     if((@[email protected]) > Convert(decimal(10,2),0))
28     begin
29         set @ConAvgHeight='大於平均身高'
30     end
31     else if((@[email protected]) = Convert(decimal(10,2),0))
32     begin
33         set @ConAvgHeight='等於平均身高'
34     end
35     else
36     begin
37         set @ConAvgHeight='小於平均身高'
38     end
39 
40     insert into @StuInfo(StuNo,StuName,StuSex,StuHeight,StuAvgHeight,StuConAvgHeight,StuCou)
41     select s.S_StuNo,s.S_Name,s.S_Sex,s.S_Height,@AvgHeight,@ConAvgHeight,c.C_Name from Student s 
42     left join Course c on s.C_S_Id=c.C_Id
43     where [email protected] 
44 
45     return
46 end
47 go

複製程式碼

執行使用者自定義多宣告表值函式:

1 select * from dbo.SearchStuCou(default);
2 
3 select * from dbo.SearchStuCou('015');
4 
5 select * from dbo.SearchStuCou('009');

適用範圍

1.      只查詢,不修改資料庫的狀態(修改、刪除表中記錄等)

2.      結果集需要通過遞迴等方法得到時,可以使用函式,函式比較靈活

3.      結果集需要直接被引用時,可以使用函式。需要對結果集進行再加工(指放在select語句中等),可以使用函式,函式可以嵌在select等sql語句中。

注意事項:

使用者自定義函式不能用於執行一系列改變資料庫狀態的操作

在編寫自定義函式時需要注意的:

對於標量函式:

1.      所有的入參前都必須加@

2.      create後的返回,單詞是returns,而不是return

3.      returns後面的跟的不是變數,而是返回值的型別,如:int,char等。

4.      在begin/end語句塊中,是return。

內嵌表值函式:

1.      只能返回table,所以returns後面一定是TABLE

2.      AS後沒有begin/end,只有一個return語句來返回特定的記錄。

多語句表值函式:

1.      returns後面直接定義返回的表型別,首先是定義表名,表明前面要加@,然後是關鍵字TABLE,最後是表的結構。

2.      在begin/end語句塊中,直接將需要返回的結果insert到returns定義的表中就可以了,在最後return時,會將結果返回。

3.      最後只需要return,return後面不跟任何變數。

參考:

http://www.cnblogs.com/xueyuangudiao/archive/2011/08/03/2126580.html

相關推薦

SQL Server 定義函式Function

sql server 自定義函式分為三種類型:標量函式(Scalar Function)、內嵌表值函式(Inline Function)、多宣告表值函式(Multi-Statement Function) 標量函式:標量函式是對單一值操作,返回單一值。 內嵌表值函式:

MySql建立定義函式Function

1.建立自定義函式 DELIMITER $$ DROP FUNCTION IF EXISTS genPerson$$ CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50) BEGIN DECLAR

xlwings:使用者定義函式UDF,VBA函式,Python函式

VBA定義函式計算 x + y如果用巨集,要把(把返回值寫到哪個單元格里的)程式碼寫到巨集裡面。VBA函式就不用Function MyAddTwoNumber(x As Double, y As Double) Dim z z = x + y

MYSQL定義函式

建立自定義函式 CREATE FUNCTION function_name(param1, param2) RETURNS 返回值型別{STRING|INTEGER|REAL|DECIMAL} routine_body - 函式體 CREATE FUN

Hive定義函式UDF的編寫及使用

前提條件: 1. 安裝好hadoop2.7.3(LInux環境下) 2. 安裝好Hive2.3.3,參考:Hive的安裝配置 3. 安裝好Maven(Windows環境下)參考:Maven安裝 4. 安裝好eclipse(Windows環境下)   Hive自定義函

把IP字串轉化為數值格式的SQL Server定義函式

create function ip2number (@ip varchar(16))returns bigintasbeginset @[email protected]+'.'declare @pos tinyintdeclare @num bigintdeclare @bin int,@off

Python列表操作定義函式

<span style="font-size:14px;"># -*- coding: cp936 -*- #list函式形參傳遞 s = "www.baidu.com" print s li1 = list(s) print 'li1',li1 #定義一個函

Pig使用者定義函式UDF

我們以氣溫統計和詞頻統計為例,講解以下三種使用者自定義函式。 使用者自定義函式 什麼時候需要使用者自定義函式呢?和其它語言一樣,當你希望簡化程式結構或者需要重用程式程式碼時,函式就是你不二選擇。 Pig的使用者自定義函式可以用Java編寫,但是也可以用Python或Java

Impala使用者定義函式UDF

因業務需要用到MD5,但Impala沒有該函式,隨藉助UDF實現。以下是實現過程。UDF實現要點:根據叢集中Hive的版本匯入對應版本的hive-exec.jar自定義UDF類要繼承介面UDF實現eva

mysql 定義函式1建立一個簡單函式

1、先建立一個無參的自定義函式: -- 如果有這個函式,就刪除 drop function if exists hello; -- 建立一個無參的函式 create function hello (

SQL Server 定義函數Function——參數默認值

指定 SQ binding img 種類 return png begin TP 原文:SQL Server 自定義函數(Function)——參數默認值sql server 自定義函數分為三種類型:標量函數(Scalar Function)、內嵌表值函數(Inline F

儲存過程與使用者定義函式SQL SERVER

聯絡 二者本質上沒有什麼區別。當儲存過程和函式被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,SQL Manager就會對儲存過程和函式進行編譯。Pr

除錯經驗——如何檢視Oracle定義函式 How to view definition of user defined functions in Oracle

問題描述: 現有的Query中似乎使用了一個自定義函式String_to_list,為了排查問題,需要檢視這個函式的定義。 方法:   --新建的function,並未儲存在All_ojbects表中,而是儲存在user_objects表中 SELECT * FRO

SQL Server定義字串分割函式——Split

我相信大部分人都碰到過,處理資料的時候,欄位的值是以 ',' (逗號)分隔的形式,所以我也不能避免。 然後我才知道,sql 是沒有類似於 C# 和 Javascript 這種分割字串的方法。( Split ) 所以我自己定義了一個 sql 函式(多宣告表值函式),程式碼如下:

SparkSQL 使用者定義函式UDF、UDAF、開窗

UDF: 操作單個數據行,產生單個數據行; UDAF: 操作多個數據行,產生一個數據行。 UDTF: 操作一個數據行,產生多個數據行一個表作為輸出。 UDF函式 通過spark.udf.register(“funcName”, func) 來進行註冊 使用:se

SparkSQL建立RDD:UDFUserDataFrame使用者建立定義函式包含動態建立schema,使用者定義函式,查詢字元的個數【Java版純程式碼】

Java版程式碼:  package com.bjsxt; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.spark.Spark

SparkSQL定義函式實現幾何平均數

SparkSQL-自定義聚合函式 (實現幾何平均數) ->建立SparkSessionparkSession ->建立自定義函式     -1、繼承UserDefinedAggregateFunction     

Keras之定義損失loss函式

在Keras中可以自定義損失函式,在自定義損失函式的過程中需要注意的一點是,損失函式的引數形式,這一點在Keras中是固定的,須如下形式: def my_loss(y_true, y_pred): # y_true: True labels. TensorFlow/The

DB2定義函式C語言

1      總體介紹 基於DB2 V9.5 1.1    使用者自定義函式(UDF) DB2 內部提供了大量的函式,但仍然不足以滿足業務千奇百怪的需要。不過DB2提供了使用者自定義函式(User Defined Function,簡稱 UDF)功能。DB29.5版本的自定

SQL Server增列Identity列的所有操作

一、定義 a)在CREATE TABLE 中: CREATE TABLE dbo.Identity_test ( ID INT IDENTITY(1,1), --(seed = 1,increment = 1) 從1開始,每次遞增1 Content NVARCHAR