1. 程式人生 > >sql 表值函式與標量值函式的區別

sql 表值函式與標量值函式的區別

 

//--------------------------------------------------------------------------

表值函式

表值函式和標量值函式的不同是 表值函式是返回一個Table型別 Table型別相當與一張儲存在記憶體中的一張虛擬表.

表值函式的語法:

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
     [ = default ] }
     [ ,...n ]
   ]
)
RETURNS TABLE
     [ WITH <function_option> [ ,...n ] ]
     [ AS ]
     RETURN [ ( ] select_stmt [ ) ]
[ ; ]

現在來寫一個比較實用的表值函式..

寫一個切割字串的表值函式

1 --------------------------這個函式用來切割字串的-----------------
2 --函式的引數   第一個是要切割的字串 第二個是要以什麼字串切割
3 CREATE FUNCTION Split(@Text NVARCHAR(4000),@Sign NVARCHAR(4000))
4 RETURNS  @tempTable TABLE(id INT IDENTITY(1,1) PRIMARY KEY,[VALUE] NVARCHAR(4000))
5 AS
6 BEGIN
7     DECLARE @StartIndex INT                --開始查詢的位置
8     DECLARE @FindIndex  INT                --找到的位置
9     DECLARE @Content    VARCHAR(4000)    --找到的值
10     --初始化一些變數
11     SET @StartIndex = 1 --T-SQL中字串的查詢位置是從1開始的
12     SET @FindIndex=0
13     
14     --開始迴圈查詢字串逗號
15     WHILE(@StartIndex <= LEN(@Text))
16     BEGIN
17         --查詢字串函式 CHARINDEX   第一個引數是要找的字串
18         --                             第二個引數是在哪裡查詢這個字串
19         --                             第三個引數是開始查詢的位置
20         --返回值是找到字串的位置
21         SELECT @FindIndex = CHARINDEX(@Sign,@Text,@StartIndex)
22         --判斷有沒找到 沒找到返回0
23         IF(@FindIndex =0 OR @FindIndex IS NULL)
24         BEGIN
25             --如果沒有找到者表示找完了
26             SET @FindIndex = LEN(@Text)+1
27         END
28         --擷取字串函式 SUBSTRING   第一個引數是要擷取的字串
29         --                             第二個引數是開始的位置
30         --                             第三個引數是擷取的長度
31         

[email protected]@StartIndex 表示找的的位置-開始找的位置=要擷取的長度
32         --LTRIM 和 RTRIM 是去除字串左邊和右邊的空格函式
33         SET @Content = LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@[email protected])))
34         --初始化下次查詢的位置
35         SET @StartIndex = @FindIndex+1
36         --把找的的值插入到要返回的Table型別中
37         INSERT INTO @tempTable ([VALUE]) VALUES (@Content)
38     END
39     RETURN
40 END

這個函式的作用就是類似.Net中的string類的Split方法

現在來測試這個函式

這個函式返回的是Table型別   所以可以用下面的語法來呼叫


SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',')

相關推薦

sql 函式標量函式區別

  //-------------------------------------------------------------------------- 表值函式 表值函式和標量值函式的不同是 表值函式是返回一個Table型別 Table型別相當與一張儲存在記憶體中的一

sql中的函式標量函式區別用法

通俗來講: 聽名字就知道區別了  表值函式返回的是一張表結果,就和一個select查詢語句一樣,只不過裡面帶入了引數或者很複雜; 標量值函式返回的只是一個值 一 、表值函式又分為行內函數與多語句函式 (1)行內函數就是沒有函式主體表是單個 SELECT。 下面是一個不帶輸

SQLServer 函式標量函式 定義方式呼叫區別

SQLServer 表值函式與標量值函式 定義方式與呼叫區別 轉載自:http://blog.sina.com.cn/s/blog_648861b901012ay2.html SQLServer 

SQL Server中表函式標量函式的比較

本文將討論一下SQL Server中表值函式與標量值函式的區別,說到函式,首先和儲存過程作個比較吧,兩者有一個共同點都是預編譯優化後儲存在磁碟中,所以效率要比T-SQL高一點點。值得注意的是,儲存過程可以建立或訪問臨時表,而函式不可以;同時函式不可以修改表中的資料,或呼叫產

資料庫之SQL(Transact-SQL-聚合函式、時間函式標量函式函式

我們在SQL查詢中除了數學函式、字串函式外還用很多實用的函式,今天就對聚合函式,時間函式,使用者自定義函式進行梳理。 一、聚合函式 聚合函式又被稱為列函式,即對列資料進行聚合。 常用的聚合函式:  ①、AVG()函式  問題:如何給查詢的結果新增列名? 新

sqlserver中的函式標量函式

顧名思義:表值函式返回的是表,而標量值函式可以返回基型別 一、表值函式 使用者定義表值函式返回 table 資料型別。對於內聯表值函式,沒有函式主體;表是單個 SELECT 語句的結果集。 以下示例建立了一個內聯表值函式。此函式的輸入引數為客戶(商店)ID,而返回 de

sqlserver自定義函式標量函式函式

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

莫比烏斯函式尤拉函式的單個的快速求法

直接根據定義求即可,複雜度為(n)−−−√(n) 題目:莫比與尤拉 AC程式 #include<cstdio> #define ll int using namespace std

引用移動建構函式的一點理解

說明:右值引用是c++11中的新特性,本來c++中是有一個左值引用的,引入右值引用後,多了很多概念,再看prime的時候,就覺得似乎讓c++更繁瑣了。偶然在知乎上看到這個話題,於是有了一點理解,遂記錄於此。知乎連結 大象與冰箱 我們還是從大象與冰箱的

拷貝建構函式運算子過載的區別

首先要說明的是,若使用者沒有定義,C++隱式宣告一個複製建構函式和一個賦值運算子(完成按資料成員複製的動作)。二者很像,但是在下邊這點上有很大的不同: 複製建構函式是隻在物件例項化時才會被呼叫,也就是說,在複製建構函式呼叫期間,這個物件處於一個未決狀態(直到複製建構函

C++ 一個demo看懂—拷貝建構函式運算子過載區別

class MyClass { public: MyClass(int i = 0) { cout << i; } MyClass(const MyClass &x) { cout << 2; }

函式函式--類

     用於獲得一個類的私有成員變數值的成員函式成為“取值函式”。取值函式不需要返回每個成員變數的字面值,但必須返回與那些值等價的東西。雖然C++語言規範沒有要求,但通常都在取值函式的名稱中包含單詞

C++ 拷貝建構函式函式區別(很嚴謹和全面)

這裡我們用類String 來介紹這兩個函式: 拷貝建構函式是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義一個新物件並用一個同類型的物件對它進行初始化時,將顯式使用拷貝建構函式。為啥形參必須是對該型別的引用呢?試

C語言程式設計基礎-09函式返回及形參

函式 返回值 形參實參 函式 在大規模的程式中需要對語句進行分組管理,把相互之間聯絡比較緊密的語句合併成一組; 分組可以在多個不同層次上進行,最低一級分組的結果叫程式碼塊,程式碼塊由{}大括號包括; 在大括號前面新增     型別名 函式名()的就是函式; 函式的形式如 v

複製建構函式操作符過載

複製建構函式也就拷貝建構函式,只能在物件初始化時呼叫,或在形參賦值時.因為它總是構造一個新物件並將舊物件的屬性值拷貝過去.賦值操作符過載則可以在任何地方呼叫,不管左操作物件為新舊,都是將右操作物件的屬性值拷貝到左操作物件

SQL Server排名函式排名開窗函式

什麼是排名函式?說實話我也不甚清楚,我知道 order by 是排序用的,那麼什麼又是排名函式呢? 接下來看幾個示例就明白了。 首先建立一個表,隨便插入一些資料。 ROW_NUMBER 函式:直接排序,ROW_NUMBER函式是以上升進行直接排序,並且以連續的順序給每一行資料一個唯一的序號。(即排名

SQL Server聚合函式聚合開窗函式

以下面這個表的資料作為示例。 什麼是聚合函式? 聚合函式:聚合函式就是對一組值進行計算後返回單個值(即分組)。聚合函式在計算時都會忽略空值(null)。 所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。 COUNT(統計函式):COUNT

pl/sql 變數的宣告

pl/sql 是一種強型別的程式語言,所有的變數必須聲明後再使用 ,要求在DECLARE部分進行宣告 變數名稱規定: 變數名稱可以有字母,數字 _ $ #等組成 所有的變數名稱要求以字母開頭,不能是oral中的保留字 變數長度小於30個字元 定義變數如果沒有賦值則以NULL作為預設值

SQl中的UDF(使用者自定義函式)儲存過程的區別、優點

UDF定義: 和儲存過程很類似,使用者自定義函式是一組有序的T_SQL語句,這些語句被預先優化和編譯,並且可以作為一個單元來進行呼叫。UDF和儲存過程的主要區別在於結果的返回方式。為了能支援多種的不同的返回值,UDF比儲存過程有更多的限制。 UDF和儲存過程的具體區別: 儲

關於SQL函式儲存過程的區別

本質上沒區別。只是函式有如:只能返回一個變數的限制。而儲存過程可以返回多個。而函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程不行。執行的本質都一樣。      函式限制比較多,比如不能用臨時表,只能用表變數.還有一些函式都不可用等等.而儲存過程的限制相