Pourquoi ne pouvons-nous pas exécuter une procédure stockée dans une fonction lorsque l'inverse est possible? p>
7 Réponses :
Je suppose que cela est dû au fait que l'exécution d'une fonction n'est pas censée modifier des données de quelque manière que ce soit et que vous vous permettriez d'exécuter une procédure stockée vous permettrait de faire cela ... P>
Vous devez modifier votre procédure stockée en fonction de l'appeler à partir d'une fonction.
ou, une solution consiste à utiliser par exemple par exemple, p> Je ne dis aucun moyen que c'est une bonne pratique mais je dis simplement que c'est une possibilité. p> p> xp_cmdshell code> pour appeler un fichier de commandes dans lequel le fichier de commandes contient l'énoncé de procédure d'exécution. Dans la fonction, vous pouvez appeler le proc. P>
Techniquement, appeler une procédure stockée à partir d'une fonction est possible. Mais rappelez-vous le but de la procédure et des fonctions stockées. P>
Objet de la fonction: strong> La fonction est utilisée pour calculer une valeur et peut donc renvoyer une valeur. Une fonction peut être appelée à partir d'une instruction SELECT tant qu'elle ne modifie pas les données. (Données de table permanentes, non tables Temps) p>
Nous ne pouvons pas appeler la procédure de stockage dans une fonction. Cependant, nous pouvons appeler une fonction dans une procédure de magasin. P>
Les fonctions sont extrêmement limitées. Ils ne peuvent effectuer aucune opération de quelque manière que ce soit capable de modifier des données. Cela signifie que vous ne pouvez pas utiliser SQL dynamique ou appeler d'autres objets (sauf fonction) p>
Certaines restrictions sont leurs fonctions, telles que (i), il ne doit pas changer de structure de table. Il faut une table réadaptée. Mais la procédure stockée peut changer. La procédure stockée peut effectuer des modifications. Nous ne pouvons donc pas appeler une procédure stockée à partir de la fonction. P>
Vous ne pouvez pas exécuter une procédure stockée dans une fonction, car une fonction n'est pas autorisée à modifier l'état de la base de données et les procédures stockées sont em> autorisées à modifier l'état de la base de données. Ceci est par définition (voir créer une fonction - limitations et restrictions ). P> Les fonctions définies par l'utilisateur ne peuvent pas être utilisées pour effectuer des actions qui modifient l'état de la base de données. P>
blockQuote> Une procédure stockée pourrait modifier l'état de la base de données ou non. Mais le compilateur SQL Server ne devrait pas nécessiter d'analyser la procédure stockée pour savoir si elle modifie ou non l'état de la base de données. Par conséquent, il n'est pas autorisé à exécuter une procédure stockée à partir d'une fonction. P> fonctionne pour simplement calcule em> quelque chose, une valeur ou un résultat de table, rien de plus que cela. Ces fonctions peuvent être appelées dans une requête code> SELECT CODE> par exemple, par exemple. p> considère maintenant ce qui se produirait si la fonction
Calculez_something code> a été autorisée à exécuter une procédure stockée qui supprimerait toutes les lignes dans
ONE_TABLE code>. Votre intention est de calculer quelque chose en utilisant la valeur du
one_table.a code> colonnes, mais vous finissez par ... Supprimer toutes les lignes dans
Certain_table code>. Ce n'est clairement pas quelque chose que vous voulez arriver. P> p>
Je sais que cela a déjà été répondu mais dans SQL Server, la fonction n'est pas supposée modifier les données, mais la procédure est censée. p>
En plus de cela, j'aime ajouter que nous ne pouvons pas sélectionner une procédure ou le mettre dans une clause où, nous pouvons le faire avec une fonction. p>
Nous utilisons la fonction pour raccourcir le code de sorte que c'est grandement utile car il réduit beaucoup de questions pour le codeur. P>
J'espère que cela aide. P>
Soin de nous dire quel DBMS vous parlez?
Peut-être que cela vous aidera. [Est-il possible d'appeler une procédure stockée dans une fonction définie par l'utilisateur?] [1] [1]: Stackoverflow.com/questions/12840065/...