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:UDF(UserDataFrame)使用者建立自定義函式(包含動態建立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