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。

您必须将其拆分为两个带有条件的语句(很遗憾,这显然不适用于视图或内联表值函数):

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 回答