J'apprends les fonctions et la procédure stockée depuis un certain temps, mais je ne sais pas pourquoi et quand je devrais utiliser une fonction ou une procédure stockée. Ils me ressemblent, peut-être parce que je suis un peu novice à ce sujet.
Quelqu'un peut-il me dire pourquoi?
Réponses:
Les fonctions sont des valeurs calculées et ne peuvent pas effectuer de modifications environnementales permanentes
SQL Server
(c.- à -d. Aucune instructionINSERT
ouUPDATE
instruction n'est autorisée).Une fonction peut être utilisée en ligne dans des
SQL
instructions si elle renvoie une valeur scalaire ou peut être jointe si elle renvoie un jeu de résultats.Un point à noter dans les commentaires, qui résument la réponse. Merci à @Sean K Anderson:
Comment appeler
SQL
fonction à partir d'une procédure de stockage et quand nous utilisons une fonction au lieu d'une procédure stockée.Salut les amis, aujourd'hui, nous allons discuter du moment où utiliser la procédure stockée et quand utiliser la fonction. En équipe simple Si vous souhaitez calculer certaines valeurs et qu'il renverra une seule valeur, ce n'est donc pas obligatoire:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
la source
La différence entre SP et UDF est indiquée ci-dessous:
la source
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:
Où MyFunction est déclaré comme:
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).
la source
SELECT * from dbo.MyTableValuedFunction()
. Les sprocs, d'autre part, peuvent être appelés directement avec ADO.NET en définissantSqlCommand.CommandType
surCommandType.StoredProcedure
.Différences entre les procédures stockées et les fonctions définies par l'utilisateur:
RAISEERROR
OU@@ERROR
ne sont pas autorisés dans les FDU.GETDATE()
ne peut pas être utilisé dans les FDU.la source
GETDATE()
peut être utilisé dans une fonction. Le pivot sur non déterministe n'est pas bon.Écrivez une fonction définie par l'utilisateur lorsque vous souhaitez calculer et renvoyer une valeur à utiliser dans d'autres instructions SQL; écrire une procédure stockée lorsque vous le souhaitez consiste à regrouper un ensemble d'instructions SQL éventuellement complexe. Ce sont deux cas d'utilisation assez différents, après tout!
la source
la source
Différence de base
La fonction doit renvoyer une valeur mais dans la procédure stockée, elle est facultative (la procédure peut retourner zéro ou n valeurs).
Les fonctions ne peuvent avoir que des paramètres d'entrée alors que les procédures peuvent avoir des paramètres d'entrée / sortie.
La fonction prend un paramètre d'entrée, elle est obligatoire mais la procédure stockée peut prendre de o à n paramètres d'entrée.
Les fonctions peuvent être appelées depuis Procedure alors que les procédures ne peuvent pas être appelées depuis Function.
Différence avancée
La procédure autorise l'instruction SELECT ainsi que l'instruction DML (INSERT / UPDATE / DELETE), tandis que la fonction n'autorise que l'instruction SELECT.
Les procédures ne peuvent pas être utilisées dans une instruction SELECT tandis que Function peut être incorporée dans une instruction SELECT.
Les procédures stockées ne peuvent pas être utilisées dans les instructions SQL n'importe où dans la section WHERE / HAVING / SELECT alors que Function peut l'être.
Les fonctions qui renvoient des tables peuvent être traitées comme un autre ensemble de lignes. Cela peut être utilisé dans JOINs avec d'autres tables.
La fonction en ligne peut être considérée comme une vue qui accepte des paramètres et peut être utilisée dans des JOIN et d'autres opérations d'ensemble de lignes.
L'exception peut être gérée par le bloc try-catch dans une procédure alors que le bloc try-catch ne peut pas être utilisé dans une fonction.
Nous pouvons opter pour la gestion des transactions dans la procédure alors que nous ne pouvons pas aller dans la fonction.
la source
la source
Returns
mot - clé et doit être de type scalaire ou de table) , mais les procédures stockées peuvent éventuellement renvoyer: a) 1Int
type de code de résultat via l'Return
instruction et / ou b) 1+ paramètres (y compris leCursor
type) via leOutput
mot clé et / ou c) 1+ ensembles de lignes via desSelect
instructions. Si seulement 1 ensemble de lignes est retourné, il peut être utilisé comme argument "execute_statement" d'une instruction "Insert Into". "une fonction définie par l'utilisateur est un outil important à la disposition d'un programmeur de serveur SQL. Vous pouvez l'utiliser en ligne dans une instruction SQL comme ceci
où
lookupValue
sera un UDF. Ce type de fonctionnalité n'est pas possible lors de l'utilisation d'une procédure stockée. En même temps, vous ne pouvez pas faire certaines choses à l'intérieur d'un UDF. La chose fondamentale à retenir ici est que les UDF:une procédure stockée peut faire ces choses.
Pour moi, l'utilisation en ligne d'un UDF est l'utilisation la plus importante d'un UDF.
la source
Les procédures stockées sont utilisées comme scripts . Ils exécutent une série de commandes pour vous et vous pouvez les planifier pour s'exécuter à certains moments. Exécute généralement plusieurs instructions DML comme INSERT, UPDATE, DELETE, etc. ou même SELECT.
Les fonctions sont utilisées comme méthodes. Vous lui passez quelque chose et cela renvoie un résultat. Devrait être petit et rapide - le fait à la volée. Généralement utilisé dans une instruction SELECT.
la source
Procédure stockée:
EXEC
ouEXECUTE
instruction .OUT
paramètre.Une fonction:
Ne peut être utilisé que pour sélectionner des enregistrements. Cependant, il peut être appelé très facilement à partir de SQL standard, comme:
ou
Pour des opérations de sélection réutilisables simples, les fonctions peuvent simplifier le code. Méfiez-vous simplement de l'utilisation de
JOIN
clauses dans vos fonctions. Si votre fonction a uneJOIN
clause et que vous l'appelez à partir d'une autre instruction select qui renvoie plusieurs résultats, cet appel de fonctionJOIN
regroupera ces tables pour chaque ligne renvoyée dans le jeu de résultats. Ainsi, bien qu'ils puissent être utiles pour simplifier une certaine logique, ils peuvent également être un goulot d'étranglement en termes de performances s'ils ne sont pas utilisés correctement.OUT
paramètre.la source
Fonction définie par l'utilisateur.
Procédure stockée
la source
Pour décider quand utiliser ce que les points suivants pourraient aider:
Les procédures stockées ne peuvent pas renvoyer une variable de table alors que la fonction peut le faire.
Vous pouvez utiliser des procédures stockées pour modifier les paramètres de l'environnement du serveur alors que vous ne pouvez pas utiliser des fonctions.
à votre santé
la source
Les fonctions SQL Server, comme les curseurs, sont destinées à être utilisées comme votre dernière arme! Ils ont des problèmes de performances et, par conséquent, l'utilisation d'une fonction table doit être évitée autant que possible. Parler de performance, c'est parler d'une table avec plus de 1 000 000 d'enregistrements hébergés sur un serveur sur un matériel de classe moyenne; sinon, vous n'avez pas à vous soucier de la perte de performances causée par les fonctions.
pour plus d'informations, voir: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
la source
Commencez avec des fonctions qui renvoient une seule valeur. La bonne chose est que vous pouvez mettre du code fréquemment utilisé dans une fonction et les renvoyer sous forme de colonne dans un jeu de résultats.
Ensuite, vous pouvez utiliser une fonction pour une liste paramétrée de villes. dbo.GetCitiesIn ("NY") Cela renvoie une table qui peut être utilisée comme jointure.
C'est une façon d'organiser le code. Savoir quand quelque chose est réutilisable et quand c'est une perte de temps n'est acquis que par essais et erreurs et par expérience.
En outre, les fonctions sont une bonne idée dans SQL Server. Ils sont plus rapides et peuvent être assez puissants. Sélection en ligne et directe. Attention à ne pas abuser.
la source
Voici une raison pratique de préférer les fonctions aux procédures stockées. Si vous avez une procédure stockée qui a besoin des résultats d'une autre procédure stockée, vous devez utiliser une instruction insert-exec. Cela signifie que vous devez créer une table temporaire et utiliser une
exec
instruction pour insérer les résultats de la procédure stockée dans la table temporaire. C'est désordonné. Un problème avec cela est que les insert-execs ne peuvent pas être imbriqués .Si vous êtes bloqué avec des procédures stockées qui appellent d'autres procédures stockées, vous pouvez rencontrer cela. Si la procédure stockée imbriquée renvoie simplement un ensemble de données, il peut être remplacé par une fonction table et vous n'obtiendrez plus cette erreur.
( c'est encore une autre raison pour laquelle nous devons garder la logique métier hors de la base de données )
la source
la source
Les fonctions peuvent être utilisées dans une instruction select, contrairement aux procédures.
La procédure stockée prend à la fois les paramètres d'entrée et de sortie, mais Functions ne prend que les paramètres d'entrée.
Les fonctions ne peuvent pas renvoyer des valeurs de type texte, ntext, image et horodatages là où les procédures le peuvent.
Les fonctions peuvent être utilisées comme types de données définis par l'utilisateur dans la table de création, mais pas les procédures.
*** Par exemple: -créer
table <tablename>(name varchar(10),salary getsal(name))
Ici, getsal est une fonction définie par l'utilisateur qui renvoie un type de salaire, lorsque la table est créée, aucun stockage n'est alloué pour le type de salaire, et la fonction getsal n'est également pas exécutée, mais lorsque nous récupérons certaines valeurs de cette table, la fonction getsal est exécutée et le return Type est renvoyé comme jeu de résultats.
la source
Je me rends compte que c'est une très vieille question, mais je ne vois aucun aspect crucial mentionné dans aucune des réponses: l'inclusion dans le plan de requête.
Les fonctions peuvent être ...
Scalaire:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Valeur table multi-instructions:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Valeur de table en ligne:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Le troisième type (valeur de table en ligne) est traité par l'optimiseur de requête essentiellement comme des vues (paramétrées), ce qui signifie que référencer la fonction à partir de votre requête est similaire au copier-coller du corps SQL de la fonction (sans réellement copier-coller), ce qui entraîne aux avantages suivants:
Ce qui précède peut entraîner des économies de performances potentiellement importantes, en particulier lors de la combinaison de plusieurs niveaux de fonctions.
REMARQUE: Il semblerait que SQL Server 2019 introduira également une certaine forme de fonction scalaire en ligne .
la source
Dans SQL Server, les fonctions et la procédure stockée sont deux types d'entités différents.
Fonction: dans la base de données SQL Server, les fonctions sont utilisées pour effectuer certaines actions et l'action renvoie immédiatement un résultat. Les fonctions sont de deux types:
Système défini
Défini par l'utilisateur
Procédures stockées: dans SQL Server, les procédures stockées sont stockées sur le serveur et il peut renvoyer zéro, une seule et plusieurs valeurs. Les procédures stockées sont de deux types:
la source