SQL錶值函式和標量值函式的區別

2021-09-06 14:33:53 字數 1707 閱讀 4389

原文:

sql錶值函式和標量值函式的區別

寫sql儲存過程經常需要呼叫一些函式來使處理過程更加合理,也可以使函式復用性更強,不過在寫sql函式的時候可能會發現,有些函式是在錶值函式下寫的有些是在標量值下寫的,區別是錶值函式只能返回乙個表,標量值函式可以返回基型別。舉個例子,當使用者刪除乙個節點的時候,是需要將當前節點下的所有子節點都刪掉,如果程式只傳乙個當前節點,那就需要寫乙個函式來得到當前節點下的所有子節點,這些子節點的資訊就可以放到乙個表中返回。

[sql]view plain

copy

alter

function

testgetsubnodes  

(  @nodeid int

)  returns

@t table

(  id bigint

identity(1,1) 

notnull

,   

nodeids int

,  nodename varchar

(500)  

)  as

begin

insert

into

@t values

(@nodeid,

'header'

);   

while exists(select

nodeid 

from

dbo.tree 

where

parentid in(

select

nodeids 

from

@t) 

andnodeid 

notin

(select

nodeids 

from

@t))  

begin

insert

into

@t select

nodeid, nodename 

from

dbo.tree 

where

parentid in(

select

nodeids 

from

@t)  

endreturn

end

這個函式的主要功能就是返回當前節點下的所有子節點,在儲存過程中寫select * from testgetsubnodes(nodeid)就可以返回表中的資料了。再寫乙個標量值函式

[sql]view plain

copy

alter

function

[dbo].[testgetsubnodes_]  

(  @nodeid int

)  returns

intas

begin

declare

@nodecount 

intselect

@nodecount=5 

from

menutree  

return

@nodecount  

end

這個函式很簡單返回乙個整型值,然後就可以在儲存過程中呼叫了,不過呼叫的方式有所不同,象上面的錶值函式呼叫是不需要所有者的,只要寫函式名稱就可以,對於標量值函式來說,是需要加上所有者的,比如所有者是dboselect dbo.testgetsubnodes_,這樣就可以返回5,如果不加dbo,那sql會不認識這個函式。

SQL 標量值函式的呼叫

呼叫 ms sql 標量值函式,應該在函式前面加上 dbo.否則會報 不是可以識別的 內建函式名稱 錯誤。例如 declare whichdb tinyint select whichdb dbo.user getwhichdb 1 看看是哪個資料庫的 另外,標量值函式就相當於乙個變數,而不是乙個表...

sql的標量值函式例子

1.分割字串,處理某個字元第幾次出現獲取後面的值use ef go object userdefinedfunction dbo f substr script date 10 27 2014 20 36 10 set ansi nulls on goset quoted identifier on...

標量值函式的用法

昨天做乙個前台顯示,就是資料庫有4個字段都是int型,需要前台把它們合成乙個字段輸出。本來想著在資料庫在加一列,後來有人提議用標量值函式,發現這樣挺好的。拿來分享一下。首先新建查詢複製下面 code set ansi nulls on go set quoted identifier on go c...