Je dois créer une fonction définie par l'utilisateur qui fonctionnerait de manière similaire à la fonction du système ISNULL dans le respect qu'il accepterait des arguments de tout type et renverrait la même valeur type. Comment cela est-il fait? L'utilisation de SQL_VARIANT en tant que type de données ne fonctionnerait pas car les valeurs SQL_VARIANT nécessitent un transtypage explicite. ISNULL effectue implicitement les conversions de type de données. Comment déclarer les types génériques qui ne nécessitent pas de conversion explicite?Fonction définie par l'utilisateur SQL Server prenant des arguments de tout type comme ISNULL
Laissez-moi le préciser. Je ne cherche pas à reproduire la fonctionnalité de la fonction ISNULL. J'ai utilisé la fonction ISNULL comme un modèle d'une fonction qui prend deux arguments de n'importe quel type de données pris en charge par SQL Server et renvoie la valeur du même type de données que les arguments.
D'autres fonctions SQL Server implémentent le même modèle: acceptent les arguments dont le type de données n'est pas explicitement déclaré et renvoient la valeur d'un autre type de données non explicitement déclaré lors de la définition de la fonction. Les exemples sont: NULLIF, CAST, CONVERT.
Je me demande comment ce modèle peut être accompli, car toute fonction UDF requiert une définition explicite des arguments et des types de données de valeur de retour.
Quelle devrait être la valeur de remplacement pour chaque type? Remplacer une chaîne NULL avec une chaîne vide est plutôt évident, mais quelle est la non-valeur pour datetime? Est-ce que Zéro est vraiment la non-valeur d'un type numérique? Que veux-tu accomplir? – Shnugo
T-SQL n'a pas de génériques et les types de retour de fonction définis par l'utilisateur sont statiques (et obligatoires), ce que vous demandez littéralement est impossible. Il y a plusieurs choses que je peux penser qui pourraient trier-de réaliser ce que vous voulez (comme une procédure stockée qui donne une table, ou SQL dynamique) mais aussi de bonnes raisons pour lesquelles vous ne voudriez pas les utiliser dans le code de production. Puisque 'ISNULL' existe déjà et fonctionne très bien, qu'est-ce que vous voulez exactement c'est" similaire "à' ISNULL', et pour quoi faire? –
Shnugo, le point est d'avoir une fonction agnostique du type d'argument et est capable d'en prendre, comme le font les fonctions comme ISNULL ou NULLIF. Il ne s'agit pas d'implémenter une autre version de ISNULL, mais de pouvoir créer une nouvelle fonction, capable de gérer les arguments de n'importe quel moment, et ce qui est plus important, renvoyer la valeur du même type que les arguments. – Ramzay