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 considérées littéralement comme n'importe quelle autre fonction que vous utiliseriez dans n'importe quel langage de programmation, mais les procédures stockées ressemblent davantage à des programmes individuels ou à un script de lot.
Les fonctions ont normalement une sortie et éventuellement des entrées. La sortie peut ensuite être utilisée comme entrée d'une autre fonction (une fonction intégrée du serveur SQL telle que DATEDIFF, LEN, etc.) ou comme prédicat d'une requête SQL - par exemple, SELECT a, b, dbo.MyFunction(c) FROM table
ou SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
Les procs stockés sont utilisés pour lier des requêtes SQL dans une transaction et s'interfacer avec le monde extérieur. Les frameworks tels que ADO.NET, etc. ne peuvent pas appeler directement une fonction, mais ils peuvent appeler directement une proc stockée.
Les fonctions ont cependant un danger caché : elles peuvent être mal utilisées et causer des problèmes de performance plutôt désagréables : considérez cette requête :
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Où MaFonction est déclarée 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 MaFonction est appelée pour chaque ligne du tableau MaTable. Si MyTable comporte 1000 lignes, cela représente 1000 requêtes ad hoc supplémentaires dans 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 le SELECT.
Il faut donc faire attention à l'écriture des fonctions. Si vous effectuez un SELECT à partir d'une table dans une fonction, vous devez vous demander s'il ne serait pas préférable d'utiliser un JOIN dans la proc stockée parente ou une autre construction SQL (telle que CASE ... WHEN ... ELSE ... END).
5 votes
venkatsqlinterview.blogspot.com/2011/05/
1 votes
wiki.answers.com/Q/
1 votes
searchsqlserver.techtarget.com/tip/
3 votes
Qu'en est-il de la vitesse ? Lequel des deux exécute la même requête le plus rapidement ?
0 votes
Il est utile de mentionner que le SP peut créer des transactions alors que la fonction non