SQL Server: Comment appeler une UDF, le cas échéant?
-
23-09-2019 - |
Question
La plupart des systèmes ont une fonction (UDF) définie par l'utilisateur disponible. Certains ne seront pas. Je veux utiliser l'UDF si elle est là:
SELECT
Users.*,
dbo.UserGroupMembershipNames(Users.UserID) AS MemberOfGroupNames
FROM Users
Sinon repli à l'alternative acceptable
SELECT
Users.*,
(SELECT TOP 1 thing FROM Something
WHERE Something.ID = Users.UserID) AS MemberGroupNames
FROM Users
Comment faire?
Ma première tentative, en utilisant la solution évidente, bien sûr échoué:
SELECT
Users.*,
CASE
WHEN (OBJECT_ID('dbo.UserGroupMembershipNames') IS NOT NULL) THEN
dbo.UserGroupMembershipNames(Users.UserID)
ELSE (SELECT TOP 1 thing FROM Something
WHERE Something.ID = Users.UserID)
END AS MemberOfGroupNames
FROM Users
pour des raisons qui me dépassent
La solution
Ceci est parce que le moteur tente de se lier à l'UDF, que ce soit lors de l'analyse ou de la préparation du plan d'exécution.
Vous devrez diviser en deux déclarations avec un conditionnel (obvisously cela ne fonctionnera pas dans une vue ou en ligne fonction table, malheureusement):
IF (OBJECT_ID('dbo.UserGroupMembershipNames') IS NOT NULL)
SELECT
Users.*,
dbo.UserGroupMembershipNames(Users.UserID)
AS MemberOfGroupNames
FROM Users
ELSE
SELECT
Users.*,
(SELECT TOP 1 thing FROM Something
WHERE Something.ID = Users.UserID)
AS MemberOfGroupNames
FROM Users
Autres conseils
Vous auriez sans doute de vérifier l'existence de la fonction première, puis sélectionnez avec ou sans l'appeler:
IF OBJECT_ID('dbo.UserGroupMembershipNames') IS NOT NULL
SELECT
Users.*,
dbo.UserGroupMembershipNames(Users.UserID) AS MemberOfGroupNames
FROM Users
ELSE
SELECT
Users.*,
(SELECT TOP 1 thing FROM Something
WHERE Something.ID = Users.UserID) AS MemberGroupNames
FROM Users
Je ne crois pas qu'il soit possible de regrouper cela dans une seule instruction conditionnelle SELECT.