SQL Server се доставя с колекция от вградени функции, които ви позволяват да извършвате различни операции. Всяка вградена функция служи за конкретна цел и не може да бъде променяна. Ако дадена функция служи на вашата цел, можете да продължите и да я използвате.
Но какво ще стане, ако не можете да намерите функция, която да служи на вашата цел?
Тогава е време да напишете своя собствена дефинирана от потребителя функция.
Какво е дефинирана от потребителя функция?
функция, дефинирана от потребителя (UDF) е рутина, която може да приема параметри, да извършва изчисления или други действия и да връща резултат. И както подсказва името, той се дефинира и създава от потребителя. В този случай „потребителят“ е SQL програмистът, DBA или този, който е написал функцията.
Терминът дефинирана от потребителя функция я отличава от вградените функции, които се доставят със SQL Server.
Можете да посочите дали UDF ще приема параметри или не, и ако е така, техните имена, типове данни и т.н. Например, можете да напишете UDF, който приема идентификатор на продукт като аргумент. След това функцията може да използва това в своето изчисление. Това означава, че изходът на функцията ще зависи от входа, който й се предоставя, когато е извикана.
След като UDF бъде създаден, той може да бъде извикан.
Извикване на дефинирана от потребителя функция
Кодът във функцията не се изпълнява, когато функцията е създадена. Изпълнява се само когато функцията е извикана .
„Извикването“ на функция понякога се нарича „извикване“ на функция. Това е, когато получавате функцията да прави това, за което е създадена. По принцип създавате функция и след това тя просто седи там и чака да бъде извикана.
Можете да извикате UDF от вашия T-SQL код, точно както бихте извикали системна функция. Например, можете да използвате UDF в WHERE
клауза, за да стесните резултатите от SELECT
изявление. Можете също да го използвате в списъка с колони за връщане.
UDF могат да се използват и в изчислени колони. Това може да бъде удобно, ако някога имате нужда от изчислена колона за достъп до данни в друга колона.
Параметри
Дефинирана от потребителя функция може да приеме до 1024 входни параметра. Въпреки това, можете също да дефинирате функция без никакви параметри, ако е необходимо.
Пример за вградена функция без никакви параметри е GETDATE()
. Тази функция просто връща текущата системна времева марка на базата данни. Не е необходимо да предавате никакви параметри, за да получите това.
Пример за дефинирана от потребителя функция с един параметър може да бъде тази, която връща данните за контакт на клиента въз основа на идентификатора на клиента. Когато извикате функцията, вие предавате идентификатора на клиента на функцията като параметър. След това функцията може да търси подробности за клиента и да ги върне в променливата return. Ако подадете идентификатор на друг клиент, функцията ще върне подробностите за този клиент.
Предимства на дефинирани от потребителя функции
Някои от основните предимства на UDF включват следното.
- Модулно програмиране
- UDFs ви позволяват да напишете код веднъж, след което да го извикате толкова пъти, колкото е необходимо. Няма нужда да пренаписвате един и същ код всеки път, когато трябва да правите едно и също нещо. Вместо това просто извикайте функцията. Това също е от полза, ако нещо се промени. Трябва да го актуализирате само на едно място – функцията. Ако не сте използвали функцията, ще трябва да я актуализирате на няколко места в приложението си.
- Ефективност
- UDF намаляват разходите за компилация на T-SQL кода, като кешират плановете и ги използват повторно за многократни изпълнения. UDF не е необходимо да се анализира повторно и да се оптимизира отново при всяка употреба. Това води до много по-бързо време за изпълнение.
- Намален мрежов трафик
- Операция, която филтрира данни въз основа на сложно ограничение, което не може да бъде изразено в един скаларен израз, може да бъде изразено като функция. След това функцията може да бъде извикана в
WHERE
клауза за намаляване на броя на редовете, изпратени до клиента.
UDF могат да имат и други, по-специфични предимства, като в предишния пример, който споменах с изчислената колона за достъп до данни в друга таблица.
Типове дефинирани от потребителя функции
Има два типа T-SQL функции, дефинирани от потребителя:
- Скаларни функции
- Дефинираните от потребителя скаларни функции връщат една стойност на данните. Вие дефинирате типа на стойността във функцията. Типът на връщането може да бъде всеки тип данни, освен текст , ntext ,изображение , курсор и клеймо за време .
- Функции с таблично значение
- Функциите със стойност на таблица (TVF) връщат таблица. Следователно техният тип връщане е table . Има два вида TVF:вградени TVF и TVF с множество изявления. Вграденият TVF няма функционално тяло. Неговата връщаща таблица е резултат от един
SELECT
изявление. TVF с няколко изявления, от друга страна, има тяло на функция. При TVF с множество оператори вие указвате структурата на таблицата във връщащата променлива.
Можете също така да създавате скаларни функции и функции с таблично значение като общи езикови функции за изпълнение (CLR), дефинирани от потребителя.
Започвайки със SQL Server 2005 (9.x), можете да пишете дефинирани от потребителя функции на всеки език за програмиране на Microsoft .NET Framework, като например Microsoft Visual Basic .NET или Microsoft Visual C#.