157 votes

Puis-je créer une fonction à usage unique dans un script ou une procédure stockée ?

Dans SQL Server 2005, existe-t-il un concept d'utilisation unique ou de fonction locale déclarée à l'intérieur d'un script SQL ou d'une procédure stockée ? J'aimerais faire abstraction d'une certaine complexité dans un script que j'écris, mais il faudrait pouvoir déclarer une fonction.

Juste curieux.

140voto

Ron Savage Points 7612

Vous pouvez créer des procédures stockées temporairement comme :

create procedure #mytemp as
begin
   select getdate() into #mytemptable;
end

dans un script SQL, mais pas de fonctions. Vous pourriez avoir la mémoire proc c'est le résultat dans une table temporaire cependant, puis utiliser cette information plus tard dans le script ..

88voto

Joel Coehoorn Points 190579

Vous pouvez appeler CREATE Function près du début de votre script et DROP Function près de la fin.

28voto

Welbog Points 32952

Les expressions de tableau communes vous permettent de définir ce qui sont essentiellement des vues qui ne durent que dans le cadre de vos instructions Select, insert, Update et delete. Selon ce que vous devez faire, ils peuvent être terriblement utiles.

18voto

Tmdean Points 4594

Je sais que je pourrais être critiqué pour avoir suggéré un SQL dynamique, mais parfois c'est une bonne solution. Assurez-vous simplement de comprendre les implications en matière de sécurité avant d'envisager cela.

DECLARE @add_a_b_func nvarchar(4000) = N'SELECT @c = @a + @b;';
DECLARE @add_a_b_parm nvarchar(500) = N'@a int, @b int, @c int OUTPUT';

DECLARE @result int;
EXEC sp_executesql @add_a_b_func, @add_a_b_parm, 2, 3, @c = @result OUTPUT;
PRINT CONVERT(varchar, @result); -- prints '5'

5voto

Gregory Hart Points 64

Voici ce que j'ai utilisé dans le passé pour accomplir le besoin d'un UDF Scalaire dans MS SQL :

IF OBJECT_ID('tempdb..##fn_Divide') IS NOT NULL DROP PROCEDURE ##fn_Divide
GO
CREATE PROCEDURE ##fn_Divide (@Numerator Real, @Denominator Real) AS
BEGIN
    SELECT Division =
        CASE WHEN @Denominator != 0 AND @Denominator is NOT NULL AND  @Numerator != 0 AND @Numerator is NOT NULL THEN
        @Numerator / @Denominator
        ELSE
            0
        END
    RETURN
END
GO

Exec ##fn_Divide 6,4

Cette approche qui utilise une variable globale pour la PROCÉDURE vous permet d'utiliser la fonction non seulement dans vos scripts, mais aussi dans vos besoins Dynamic SQL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X