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 de fonction à usage unique ou locale déclaré à l'intérieur d'un script SQL ou d'une procédure stockée? Je voudrais faire abstraction de la complexité d'un script que j'écris, mais cela nécessiterait de pouvoir déclarer une fonction.

Juste curieux. Merci!!

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

    Vous pouvez créer des procédures stockées temporaires telles que:

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

    dans un script SQL, mais pas de fonctions. Vous pourriez avoir le proc stocker, il en résulte une table temporaire, puis utiliser cette information plus tard dans le script ..

    Les expressions de table 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.

    Je sais que je pourrais être critiqué pour avoir suggéré le SQL dynamic, mais parfois c'est une bonne solution. Assurez-vous de bien comprendre les implications en termes de security 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' 

    Dans les scripts, vous avez plus d'options et un meilleur tir à la décomposition rationnelle. Regardez en mode SQLCMD (Menu Requête -> mode SQLCMD), en particulier les commands: setvar et: r.

    Dans une procédure stockée vos options sont très limitées. Vous ne pouvez pas créer une fonction directement avec le corps d'une procédure. Le mieux que vous pouvez faire est quelque chose comme ça, avec SQL dynamic:

     create proc DoStuff as begin declare @sql nvarchar(max) /* define function here, within a ssortingng note the underscore prefix, a good convention for user-defined temporary objects */ set @sql = ' create function dbo._object_name_twopart (@object_id int) returns nvarchar(517) as begin return quotename(object_schema_name(@object_id))+N''.''+ quotename(object_name(@object_id)) end ' /* create the function by executing the ssortingng, with a conditional object drop upfront */ if object_id('dbo._object_name_twopart') is not null drop function _object_name_twopart exec (@sql) /* use the function in a query */ select object_id, dbo._object_name_twopart(object_id) from sys.objects where type = 'U' /* clean up */ drop function _object_name_twopart end go 

    Cela se rapproche d'une fonction temporaire globale, si une telle chose existait. C'est toujours visible pour les autres users. Vous pouvez append le @@ SPID de votre connection pour que le nom soit unique, mais cela nécessitera également le rest de la procédure pour utiliser le SQL dynamic.

    Ci-dessous est ce que j'ai utilisé dans le passé pour accomplir le besoin d'un UDF scalaire en 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 SQL dynamics.