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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top