2010-04-01 12 views
0

大多数系统都有一个用户定义的函数(UDF)可用。有些人不会。我想使用UDF,如果它的存在:SQL Server:如何调用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 

超出我的原因

回答

2

这是因为在解析或准备执行计划期间,引擎正在试图绑定到UDF。

你将不得不将其与条件(obvisously这不会在视图或内联表值函数的工作,遗憾的是)分成两个语句:

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 
+0

....但只能有一个。较低的GearScore的凯德得到它。 – 2010-04-02 15:47:31

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语句中。

+0

好看起来你们俩有确切同样的答案.... – 2010-04-02 15:48:33