2010-04-01 2 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 получает его. –

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

Ну похоже, у вас обоих точная такой же ответ .... –

 Смежные вопросы

  • Нет связанных вопросов^_^