Функції та збережені процедури служать окремим цілям. Хоча це не найкраща аналогія, функції можна розглядати буквально як будь-яку іншу функцію, яку ви використовуєте в будь-якій мові програмування, але збережені програми більше схожі на окремі програми або пакетний сценарій.
Функції зазвичай мають вихід і необов'язково входи. Потім вихід може використовуватися як вхід до іншої функції (вбудований SQL-сервер, такий як DATEDIFF, LEN тощо) або як предикат до SQL-запиту - наприклад, SELECT a, b, dbo.MyFunction(c) FROM table
або SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
Збережені програми використовуються для зв’язування SQL-запитів разом у транзакції та взаємодії із зовнішнім світом. Такі рамки, як ADO.NET тощо, не можуть викликати функцію безпосередньо, але вони можуть викликати збережений протокол безпосередньо.
Функції мають приховану небезпеку: вони можуть бути неправильно використані та спричинити досить неприємні проблеми з роботою: врахуйте цей запит:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Де MyFunction оголошено як:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Тут відбувається те, що функція MyFunction викликається для кожного рядка таблиці MyTable. Якщо MyTable має 1000 рядків, то це ще 1000 спеціальних запитів до бази даних. Аналогічно, якщо функція викликається, коли зазначено в специфіці стовпця, тоді функція буде викликана для кожного рядка, повернутого SELECT.
Тому вам потрібно бути обережними функції написання. Якщо ви вибираєте SELECT з таблиці у функції, вам потрібно запитати себе, чи можна краще виконати приєднання до системи JOIN у батьківському зберігається процесорі чи якійсь іншій конструкції SQL (наприклад, CASE ... WHEN ... ELSE ... Кінець).