1. 程式人生 > >sqlserver自定義函式(標量值函式,表值函式)

sqlserver自定義函式(標量值函式,表值函式)

在sqlserver中,根據函式返回值形式的不同將使用者自定義的函式分為”標量值函式“和”表值函式“兩種型別。如下圖所示,可以在資料庫中的可程式設計->函式中進行檢視。


標量函式,返回單個值,表值函式返回表資料

1.標量值函式

標量值函式返回一個確定型別的標量值,其返回型別除text、ntext、image、cursor、timestamp、和table型別外的其他資料型別,函式體語句定義在begin-end內部。在returns(注意有帶s)語句後定義返回值的資料型別,並且函式的最後一條語句必須為return,(注意沒帶s),其格式如下

<strong></strong><pre name="code" class="sql">CREATE FUNCTION 函式名(引數)
RETURNS 返回型別
AS
BEGIN
	SQL語句
	RETURN;
END

下面是一個例子:
--建立標量函式,返回兩個數之間的較大者
CREATE FUNCTION dbo.F3_GetMax
(
	@a INT,   --函式的兩個引數
	@b INT
)
RETURNS INT --返回型別為INT
AS
BEGIN
	DECLARE @max INT;
	IF(@a>[email protected])
	BEGIN
		SET @max = @a;
	END
	ELSE
	BEGIN
		SET @max = @b
	END

	RETURN @max;  --最後return返回@max中的值
END

--呼叫函式
SELECT dbo.F3_GetMax(2,3);
注意:

(1)必須使用兩部分組成函式的名字來呼叫函式,即架構.物件名,如dbo.F3_GetMax(2,3)

(2)所有的傳入引數前必須加@

(3)不要寫漏和寫錯關鍵字,如as,returns,return

(4)returns後面不是跟一個變數,而是跟變數的返回值型別

(5)在begin/end語句塊中,使用的是return

2.表值函式

表值函式有分為:內聯表值函式和多語句表值函式

(1)內聯表值函式

內聯表值函式以表的形式進行返回,函式體不需要像標量值表值函式一樣使用begin/end進行包圍,其返回值是由一個位於return子句中的select命令從資料庫中篩選出來,格式如下

<strong></strong><pre name="code" class="sql">CREATE FUNCTION 函式名稱(引數)
RETURNS TABLE
AS
RETURN
(
	一條sql查詢語句
)
下面是一個例子
CREATE FUNCTION F3_GetEmployeeSalary
(
	@EmployeeID VARCHAR(50) --引數
)
RETURNS TABLE  --返回型別為表
AS
RETURN
(
	SELECT * FROM dbo.TEmployee
	WHERE EmployeeID = @EmployeeID   --通過一條sql查詢語句獲取表中資料
)
--函式呼叫
SELECT * FROM F3_GetEmployeeSalary('1')

注意:

1)只能返回Table,returns後邊一定是table

2)as後面沒有begin/end,只有一個return語句返回特定的記錄

(2)多語句表值函式

多語句表值函式可以看做標量值函式與內聯表值函式的結合體,其格式如下

CREATE FUNCTION 函式名(引數)
RETURNS 表變數名稱(表變數欄位定義)
AS
BEGIN
	SQL語句
	RETURN;
END
例子如下
CREATE FUNCTION dbo.GetEmployeeSalary
(
 @EmployeeID VARCHAR(50),
 @EmployeeName VARCHAR(50)
)
RETURNS @table TABLE  --定義表變數,用於返回結果集資料
(
 EmployeeID VARCHAR(50),
 EmployeeName VARCHAR(50),
 Salary INT,
 NowTime VARCHAR(50)
)
AS
BEGIN
 WITH CTEEmployeeSalary AS
 (
 SELECT 
 EmployeeName,
 EmployeeID,
 Salary,
 GETDATE() AS timeNow
 FROM dbo.TEmployee
 WHERE EmployeeID = @EmployeeID
 AND EmployeeName = @EmployeeName
 )


 INSERT INTO @table
 SELECT EmployeeName,EmployeeID,Salary,timeNow
 FROM CTEEmployeeSalary


 RETURN;  --return語句返回表變數
END

SELECT * FROM dbo.GetEmployeeSalary('1','aa')
注意:

1)returns後面直接定義返回的表型別,首先是定義表名,表明前面要加@,然後是關鍵字TABLE,最後是表的結構。(實質上是定義了一個表變數)

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

3) 最後只需要return,return後面不跟任何變數。(返回的是表變數裡面的資料)


相關推薦

Android仿最新微信定義相機長按拍攝輕點拍照

最近在開發即時通訊這個模組的時候使用到了自定義的相機,需求與微信一樣,要求相機能長按和輕點,當時在網上找自定義相機的資源,很少,所以,我在這裡把我的一些開發經驗貼出來,供大家學習。 大致完成的功能如下: 長按拍攝視訊,輕點拍照 前後攝像頭的切換 閃光的

bootstrap 中關於模態框位置的定義設定在不改變原始碼的前提下

        用過bootstrap的童鞋們在使用模態框的時候一定見過這幾個class :modal fade  modal-dialog modal-body ,至於這些class都有什麼作用,大家去bootstrap官網去查一下就知道了。

Spark2.x 如何實現定義排序利用元組類--隱式轉換Ordering,Ordered等實現

交流QQ: 824203453 需求: 對於有複雜排序條件的需求,可以利用自定義排序來實現,同時可以使用多種方案實現自定義排序需求。 對指定的資料(欄位分別為:名稱 年齡 顏值,資料以空格分割),按照指定的要求排序,排序要求為:根據顏值降序,如果顏值

Android定義PopWindowQQ、微信彈出選單

前段時間在個人開發的專案中需要用到彈出選單,類似QQ右上角的彈出選單,自己使用popwin的次數也不是很多,其中也遇到過一點問題,今天正好有時間就把一些經驗分享給大家。 先來看看最終實現過後的效果怎麼樣,下面放上圖 自定義的彈出選單是繼承的p

sqlserver定義函式標量函式函式

在sqlserver中,根據函式返回值形式的不同將使用者自定義的函式分為”標量值函式“和”表值函式“兩種型別。如下圖所示,可以在資料庫中的可程式設計->函式中進行檢視。 標量函式,返回單個值,表值函式返回表資料 1.標量值函式 標量值函式返回一個確定型別的標量值,其

Presto-定義UDF例項(標量函式)

背景介紹 這篇文章主要說明一下關於Presto中UDF的開發。這個例項中的自定方法的邏輯很簡單,只是傳如一個字串,然後在字串前面拼裝一個Hello,只是為了說明如何去自己實現一個Scalar Function。 下面是具體步驟及程式碼 1.建立Maven工程 p

Velocity定義指令函式

使用velocity的時候,我們可能需要實現自定義的函式,類似: #somefun() 這個函式可能是需要做一些業務程式碼,或者往context存取變數,或者可以向頁面輸出html程式碼。 假如我們要寫一個輸出hello xxx的函式,其中xxx是從context中取出的變

Sqlserver定義函式Function

https://www.cnblogs.com/weihengblogs/p/4216755.html 一.FUNCTION: 在sqlserver2008中有3中自定義函式:標量函式/內聯表值函式/多語句表值函式,首先總結下他們語法的異同點: 同點:1.建立定義是一樣的:  &nbs

15-定義物件建構函式

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head&g

Keras之定義損失loss函式

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

sqlserver 定義、刪除、執行 函式和儲存過程

自定義儲存過程: if (object_id('p_wm_get_dynstore', 'P') is not null) drop proc p_wm_get_dynstore go create procedure p_wm_get_dynstore( @s

java定義類型 作為HashMap中的Key Pair<V,K>為例

由於 con als void hash system 進行 原型 自定義 由於是自定義類型,所以HashMap中的equals()函數和hashCode()函數都需要自定義覆蓋。 不然內容相同的對象對應的hashCode會不同,無法發揮算法的正常功能,覆蓋equals函

定義的類建立的物件使用len(x)函式和abs(x)函式

class Mylist: '''自定義的容器類,內部使用內建的列表儲存資料''' def __init__(self, iterable): self.data = [x for x in iterable] def __repr__(self): return "Mylist(%s)" % self.

將例3.14改寫為在類模版外定義各成員函式第三章第十二題

#include <iostream> using namespace std; template<class numtype> class Compare {public: Compare(numtype a,numtype b); numtype

定義類MyThread 實現Runnable介面函式建立5個執行緒定義執行緒類的建構函式輸出 建立執行緒X

package com.heima.gu; import java.util.HashMap; public class Test01 { /**自定義類MyThread 實現Runnabl

C# .NET 獲取列舉定義屬性特性資訊

一、引言 列舉為我看日常開發的可讀性提供的非常好的支援,但是有時我們需要得到列舉值得描述資訊或者是註釋(備註)資訊 比如要獲得 TestEmun.aaa 屬性值得備註 AAA,比較不方便得到。     public enum TestEmun     {       ///

TTCN3新執行器系列-如何最小化類的成員函式對拷貝構造和賦操作函式的反思

2009年4月份,我們的TTCN3新執行器大體功能已經完成了,於是找了幾個專案來試點應用。 應用效果不太理想,特別是對於5萬行以上的指令碼工程,且包括大asn檔案的情況。 新執行器轉換出來的C++程式碼量很大,特別是由於asn型別很多,導致hpp檔案程式碼量大的編譯速度下降嚴

.NET(C#):獲取方法返回定義特性Attribute

.NET中特性的索取就是圍繞著ICustomAttributeProvider介面(System.Reflection名稱空間內),而MethodInfo類的ReturnTypeCustomAttributes屬性直接返回方法返回值的ICustomAttributeProvider介面物件。同時Method

定義監控阿裏雲&zabbix

阿裏雲監控 自定義監控 zabbix腳本監控 mysql監控 自定義監控(阿裏雲&zabbix)目前阿裏雲對25端口有限制,無法在阿裏雲上搭建郵件服務器發送告警郵件,如果需要郵件通知,可以采取下面方法:1.開同阿裏雲企業郵箱2.使用阿裏雲監控告警3.第三方zabbix自定義腳本監控一、

淺析在QtWidget中定義ModelbeginInsertRows()和endInsertRows()是空架子類似於一種信號用來通知底層

cti ron 初學者 開發 http 沒有 insert ati 學習 Qt 4推出了一組新的item view類,它們使用model/view結構來管理數據與表示層的關系。這種結構帶來的功能上的分離給了開發人員更大的彈性來定制數據項的表示,它也提供一個標準的model接