2012-05-03 21 views
16

什麼是在SQL Server中創建內聯標量函數的正確語法?內聯標量函數:真實還是虛擬?

聯機叢書,在Types of Functions章(2005年及以上),因爲如果它們存在約內聯標量函數會談,就好像沒有BEGIN...END塊需要(與多功能對比):

對於內聯標量函數,沒有函數體;標量 值是單個語句的結果。對於多語句標量函數,在BEGIN ... END塊中定義的函數體包含一系列返回單個值的Transact-SQL語句。

我還注意到一排「的是:內聯標量函數」在spt_values表對象類型列表

SELECT name 
FROM master..spt_values 
WHERE type = 'O9T' 
AND name LIKE '%function%' 

我曾嘗試沒有成功創建這樣的功能:

CREATE FUNCTION AddOne(@n int) RETURNS int 
AS 
    RETURN @n + 1 

該錯誤消息是

Msg 102,Level 15,State 31,Procedure AddOne,Line 3語法錯誤 'RETURN'附近。

我是否錯過了某些東西,或者在聯機叢書中是否有錯誤?

+0

我沒有看到BOL for CREATE FUNCTION或者你引用的鏈接意味着你不需要BEGIN..END塊。我認爲你錯在閱讀某些東西。 –

+0

爲了澄清,我想創建一個'IS'類型的函數,而不是'FN'或'TF'。 –

+0

「對於內聯標量函數,沒有函數體」是什麼意思? –

回答

8

那麼,AFAIK,不存在(即使在隱藏的數據庫中也不存在),並且沒有語法可以創建一個。所以看起來,這是微軟在SQL Server 2005的啓動階段通過爲它(和doc!)添加一個類型而預料到的,但是由於某種原因從未真正實現過。

儘管它是所有Ms Sql Server中最受歡迎的功能之一。主要是因爲默認的UDF非常慢,我們最終不得不後端ITVF來獲得相同的效果。 (困難和笨拙,但它的作品)。

+2

看起來他們差不多在這裏http://www.vldb.org/pvldb/vol11/p432-ramachandra。 pdf –

+1

@MartinSmith WOW!所以他們決定修復所有*標量函數,而不是隻實現內聯標量函數?我不得不承認,這聽起來很棒,但它似乎仍然可以將內聯列爲廉價和簡單的臨時選項。 – RBarryYoung

1

我看到同樣的事情。這句話似乎是「內聯標量函數」的唯一參考。 This article聲稱內聯表值函數可以足夠快地完成這項工作。

1

正確,沒有內聯標量函數這樣的事情。可以通過使用inline-TVF來「模擬」,但是,任何「客戶」的語法都需要改變。在 「客戶端」 代碼

create function dbo.AddOne(@input int) returns table as return (select @input + 1 as value); 

2),這樣做...

(select value from dbo.AddOne(Column)) as ColumnPlusOne 

的,現在你有一個正常運作的內聯標量函數: 1)創建,他的功能。

我不得不這樣做是爲了代替很多標量UDF的,看起來像這樣我的客戶端代碼......

create function dbo.GetLookupID(@code varchar(50)) returns int 
as 
begin 
    declare @return int; 
    select @return = LookupID from dbo.Lookups where Code = @code; 
    return @return; 
end; 

我試着通過去除可變定影它...

create function dbo.GetLookupID(@code varchar(50)) returns int 
as 
begin 
    return (select LookupID from dbo.Lookups where Code = @code); 
end; 

這是一個進步,但是,仍然有不愉快的表現。當我改變爲iTVF並改變了通話習慣......它變得更好了。