2012-05-03 14 views
16

Jaka jest prawidłowa składnia, aby utworzyć wbudowaną funkcję skalarną w serwerze SQL Server?Inline funkcje skalarne: prawdziwe lub vaporware?

Books Online, w Types of Functions rozdziału (2005 i więcej), opowiada o Inline funkcji skalarnych, jak gdyby one istnieją i jak gdyby nie jest wymagane BEGIN...END blok (w przeciwieństwie do funkcji multiline):

dla wbudowana funkcja skalarna, nie ma ciała funkcyjnego; wartość skalarna jest wynikiem pojedynczej instrukcji. W przypadku wielostanowiskowej funkcji skalarnej treść funkcji zdefiniowana w bloku BEGIN ... END zawiera serię instrukcji Transact-SQL, które zwracają pojedynczą wartość.

Zauważyłem również wiersz dla „IS: inline funkcja skalarna” na liście typów obiektów w tabeli spt_values:

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

próbowałem stworzyć taką funkcję bez powodzenia :

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

komunikat o błędzie jest

Msg 102, Poziom 15, Stan 31, Procedura AddOne, Wiersz 3 Niepoprawna składnia w pobliżu 'RETURN'.

Czy brakuje mi czegoś lub czy jest błąd w książkach online?

+0

Nie widzę, jak BOL dla CREATE FUNCTION, ani link, do którego się odwołuje, oznacza, że ​​nie potrzebujesz bloków BEGIN..END. Myślę, że coś źle czytasz. –

+0

Aby wyjaśnić, chciałbym utworzyć funkcję typu "IS", a nie "FN" lub "TF". –

+0

Co oznacza "dla wbudowanej funkcji skalarnej, nie ma ciała funkcyjnego"? –

Odpowiedz

8

Cóż, AFAIK, żaden nie istnieje (nawet w ukrytej bazie danych) i nie ma żadnej składni, aby ją utworzyć. Wydaje się więc, że jest to coś, co Microsoft musiał przewidzieć w przygotowaniu do SQL Server 2005, dodając do niego typ (i doc!), Ale nigdy faktycznie nie zaimplementowany z jakiegoś powodu.

Chociaż jest to jedna z najczęściej wybieranych funkcji dla wszystkich serwerów Ms Sql. Przede wszystkim dlatego, że domyślne UDF są tak powolne i kończymy na konieczności posiadania zaplecza ITVF, aby uzyskać ten sam efekt. (trudne i niezgrabne, ale działa).

+2

Wygląda na to, że są prawie na stronie http://www.vldb.org/pvldb/vol11/p432-ramachandra. pdf –

+1

@MartinSmith WOW! Więc postanowili naprawić * wszystkie * funkcje skalarne zamiast po prostu implementować wbudowane funkcje skalarne? Muszę przyznać, brzmi to wspaniale, ale wygląda na to, że mogliby nam dać inline jako tanią i łatwą tymczasową opcję. – RBarryYoung

1

Widzę to samo. Zdanie to wydaje się być jedynym odniesieniem do "wbudowanych funkcji skalarnych". This article twierdzi, że funkcje wbudowane w tabelę mogą być wystarczająco szybkie, aby wykonać zadanie.

1

Prawidłowo, nie ma czegoś takiego jak wbudowana funkcja skalarna. Można "zasymulować" za pomocą inline-TVF, jednak składnia "klientów" będzie musiała ulec zmianie. 1) utworzyć he funkcję:

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

2) w kodzie "klient", to zrobić ...

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

teraz masz funkcję funkcjonowanie inline skalarnego.

miałem to zrobić, aby zastąpić wiele skalarnych UDF w moim kodzie klienta, który wyglądał tak ...

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; 

Próbowałem go naprawić poprzez usunięcie zmiennej ...

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

To była poprawa, jednak nadal było nieprzyjemne uderzenie wydajności. Kiedy przeszedłem na iTVF i zmieniłem konwencję wywoływania ... stało się znacznie lepiej.

Powiązane problemy