Les fonctions et les procédures stockées ont des objectifs distincts. Bien que ce ne soit pas la meilleure analogie, les fonctions peuvent être vues littéralement comme n'importe quelle autre fonction que vous utiliseriez dans n'importe quel langage de programmation, mais les proc stockés sont plus comme des programmes individuels ou un script batch.
Les fonctions ont normalement une sortie et éventuellement des entrées. La sortie peut ensuite être utilisée comme entrée vers une autre fonction (un SQL Server intégré tel que DATEDIFF, LEN, etc.) ou comme prédicat pour une requête SQL - par exemple, SELECT a, b, dbo.MyFunction(c) FROM table
ouSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
Les proc stockés sont utilisés pour lier les requêtes SQL ensemble dans une transaction, et s'interfacer avec le monde extérieur. Les cadres tels que ADO.NET, etc. ne peuvent pas appeler directement une fonction, mais ils peuvent appeler directement un proc stocké.
Les fonctions ont cependant un danger caché: elles peuvent être mal utilisées et provoquer des problèmes de performances plutôt désagréables: considérez cette requête:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Où MyFunction est déclaré comme:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Ce qui se passe ici, c'est que la fonction MyFunction est appelée pour chaque ligne de la table MyTable. Si MyTable a 1000 lignes, alors c'est encore 1000 requêtes ad hoc sur la base de données. De même, si la fonction est appelée lorsqu'elle est spécifiée dans la spécification de colonne, la fonction sera appelée pour chaque ligne renvoyée par SELECT.
Vous devez donc faire attention aux fonctions d'écriture. Si vous effectuez SELECT à partir d'une table dans une fonction, vous devez vous demander s'il peut être mieux exécuté avec un JOIN dans le proc stocké parent ou une autre construction SQL (comme CASE ... WHEN ... ELSE ... FIN).