简体   繁体   中英

Stored procedure question with IS_MEMBER

I have a table Users with columns

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

ID can be a userid (in which case groupRank is NULL), a domain group with a rank (in which case grouprank is not null) or a reserved default group called #DefaultGroup.

I need a stored procedure that will:

If ID=SYSTEM_USER, return that Definition

Otherwise - foreach record in Users with GroupRank NOT NULL in order of group rank, if IS_MEMBER(ID) =1, that definition (if any)

Otherwise - the #DefaultGroup definition (if it's there)

Otherwise return NULL.

Is there an easy way to do this?

If I'm understanding you correctly, you might be able to use some sort of case statement similar to the one below:

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]

This seems to work as a table function

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM