SQL Server: как вызвать UDF, если есть? - PullRequest
0 голосов
/ 01 апреля 2010

В большинстве систем будет доступна пользовательская функция (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

по не зависящим от меня причинам

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Это потому, что движок пытается привязаться к 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 
2 голосов
/ 01 апреля 2010

Вам, вероятно, придется сначала проверить наличие функции, а затем выбрать с вызовом или без него:

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.

...