Вопрос о хранимой процедуре с IS_MEMBER - PullRequest
0 голосов
/ 11 июня 2009

У меня есть таблица Пользователи со столбцами

ID nvarchar(4000)
GroupRank int
Definition nvarchar(4000)

ID может быть идентификатором пользователя (в этом случае groupRank равен NULL), группой домена с рангом (в этом случае grouprank не равен NULL) или зарезервированной группой по умолчанию, которая называется # DefaultGroup.

Мне нужна хранимая процедура, которая будет:

Если ID = SYSTEM_USER, вернуть это определение

В противном случае - запись foreach в Users с GroupRank NOT NULL в порядке ранга группы, если IS_MEMBER (ID) = 1, это определение (если есть)

В противном случае - определение #DefaultGroup (если оно есть)

В противном случае вернуть NULL.

Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Если я правильно вас понимаю, вы можете использовать какое-то утверждение, похожее на приведенное ниже:

SELECT
  ID,
  GroupRank,
  Definition = CASE
                WHEN ID = SYSTEM_USER THEN Definition
                WHEN GroupRank IS NOT NULL AND IS_MEMBER(ID) = 1 THEN Definition
                WHEN ID = '#DefaultGroup' THEN Definition
                ELSE NULL
               END
FROM
     [YourTable]
0 голосов
/ 11 июня 2009

Это похоже на табличную функцию

CREATE FUNCTION dbo.GetDefinition()
RETURNS @definition TABLE 
(
    Defn nvarchar(4000) NULL 
)
AS 
BEGIN
    DECLARE @sys_usr nvarchar(4000);
    DECLARE @def_usr nvarchar(4000);
    SET @sys_usr = SYSTEM_USER;
    SET @def_usr = '#Default';

    IF(EXISTS(SELECT * FROM dbo.User WHERE ID = @sys_usr))
    BEGIN
        INSERT @definition SELECT Definition FROM User WHERE ID = @sys_usr
    END ELSE
    BEGIN
        IF(EXISTS(SELECT TOP 1 * FROM dbo.User WHERE IS_MEMBER(ID) = 1 AND GroupRank IS NOT NULL ORDER BY GroupRank))
        BEGIN
            INSERT @definition SELECT TOP 1 Definition FROM dbo.User 
                WHERE IS_MEMBER(ID) = 1 AND GroupRank IS NOT NULL ORDER BY GroupRank
        END ELSE
        BEGIN
            IF(EXISTS(SELECT * FROM dbo.User WHERE ID = @def_usr))
            BEGIN
                INSERT @definition SELECT Definition FROM User WHERE ID = @def_usr
            END
        END
    END

    RETURN;
END
...