0

ほとんどのシステムでは、ユーザー定義関数 (UDF) を使用できます。しない人もいます。UDF がある場合はそれを使用したい:

SELECT 
    Users.*,
    dbo.UserGroupMembershipNames(Users.UserID) AS MemberOfGroupNames
FROM Users

それ以外の場合は、許容可能な代替手段にフォールバックします

SELECT
   Users.*,
   (SELECT TOP 1 thing FROM Something 
    WHERE Something.ID = Users.UserID) AS MemberGroupNames
FROM Users

どうやって?


もちろん、明白な解決策を使用した私の最初の試みは失敗しました:

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

私を超えた理由で

4

2 に答える 2

2

おそらく、最初に関数の存在を確認してから、関数を呼び出すかどうかを選択する必要があります。

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

これを単一の条件付き SELECT ステートメントにまとめることはできないと思います。

于 2010-04-01T19:10:00.500 に答える
2

これは、実行計画の解析中または準備中に、エンジンが UDF へのバインドを試みているためです。

条件付きで 2 つのステートメントに分割する必要があります (残念ながら、これはビューまたはインライン テーブル値関数では機能しません)。

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 
于 2010-04-01T19:15:04.130 に答える