Ich bin ein großer Freund von Inline-Table-Valued-Functions. Das sind Funktionen, die nur aus einem SELECT-Statement bestehen, dass eine Tabelle als Ergebnis liefert. Hier ein Beispiel:

CREATE FUNCTION test3.f_orders
(@name NVARCHAR(100))
RETURNS TABLE
RETURN (SELECT ordid, o.custid, o.uid, orderdate, total
FROM test3.orders AS o
JOIN test3.user2customers AS uc
ON o.custid=uc.custid
JOIN test3.users AS u
ON uc.uid=u.uid
WHERE u.name = @name);

Sie werden manchmal als parametrisierte Views bezeichnet, weil wirklich eine sehr große Verwandtschaft zu Views besteht. Das geht so weit, dass man sowohl Daten "in" die Funktion einfügen als auch ändern kann. Damit das geht, müssen freilich wieder die gleichen Regeln wie bei Views eingehalten werden.

Beispiel für INSERT:
INSERT INTO test3.f_orders('Tom') (custid)
VALUES (2);

Beispiel für UPDATE:
UPDATE o
SET total=(SELECT SUM(price*amount)
FROM test3.f_orderdetails('Tom') AS od
WHERE od.ordid=o.ordid)
FROM test3.f_orders('Tom') AS o
WHERE o.ordid=@ordid

Das Beispiel für DELETE ist ein Bausatz für Euch als Hausaufgabe… 😉