Ce qu’il n’est pas possible d’utiliser dans les fonctions T-SQL, et pourquoi

Voici la liste des instructions qu’il n’est pas possible d’utiliser dans un fonction définie par l’utilisateur (UDF) sous SQL Server

Rappelons d’abord ce qu’est une fonction:

En mathématiques, une fonction, aussi appelée application, est la donnée de deux ensembles : un ensemble de départ et un ensemble d’arrivée, et une relation associant chaque élément de l’ensemble de départ à un et un seul élément de l’ensemble d’arrivée.
En informatique, une fonction est un sous-programme qui exécute un tâche spécifique, et qui est relativement indépendante du code qui l’entoure

De ces deux définitions, on peut déduire qu’une fonction :

– doit effectuer seulement un calcul,
– ne doit pas dépendre du contexte de base de données

C’est en outre pour ces raisons que sous SQL Server, il n’est pas possible, dans une UDF :

– d’appeler une procédure stockée, sauf si c’est une procédure stockée étendue
– d’utiliser la structure de contrôle TRY … CATCH
– d’utiliser @@ERROR
– d’utiliser RAISERROR
– de retourner plusieurs ensembles de données
– d’utiliser des fonctions non déterministes comme GETDATE()
– d’utiliser des tables temporaires (# et ##)
– d’utiliser du code SQL dynamique
– d’utiliser une commande SET
– d’utiliser un quelconque ordre de modification de données (INSERT, UPDATE, DELETE), sauf sur les variables table locales à la fonction
– d’encapsuler tout ou partie du code de la fonction dans une transaction (BEGIN | COMMIT | ROLLBACK TRANSACTION) (Merci SQLPro ;))

ElSuket

2 réflexions au sujet de « Ce qu’il n’est pas possible d’utiliser dans les fonctions T-SQL, et pourquoi »

  1. Depuis de la version SQL Server 2005, la liste des fonctions non déterministe, non autorisées sous SQL Server 2000 a été réduite.
    Depuis la version SQL Server 2005, les 17 fonctions non déterministes ci-dessous sont désormais autorisées dans les fonctions UDF :
    CURRENT_TIMESTAMP,
    @@MAX_CONNECTIONS,
    GET_TRANSMISSION_STATUS,
    @@PACK_RECEIVED,
    GETDATE,
    @@PACK_SENT,
    GETUTCDATE,
    @@PACKET_ERRORS,
    @@CONNECTIONS,
    @@TIMETICKS,
    @@CPU_BUSY,
    @@TOTAL_ERRORS,
    @@DBTS,
    @@TOTAL_READ,
    @@IDLE,
    @@TOTAL_WRITE,
    @@IO_BUSY.

    En revanche les 4 fonctions non déterministes ci-dessous ne sont toujours pas autorisées dans les fonctions : UDF
    NEWID,
    RAND,
    NEWSEQUENTIALID,
    TEXTPTR.

    SQL Server Books Online (BOL) ne fournit aucune raison pour ce changement et ne fait aucune distinction entre les fonctions non déterministes qui sont autorisés dans une fonction de celles qui ne sont pas !

    A+

Laisser un commentaire