2009-06-11 11 views
0

ich eine Tabelle Benutzer mit Spalten habeStored Procedure Frage mit IS_MEMBER

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

ID kann ein Benutzer-ID sein (in diesem Fall groupRank ist NULL), eine Domäne-Gruppe mit einem Rang (in diesem Fall grouprank nicht null) oder eine reservierte Standardgruppe namens #DefaultGroup.

Ich brauche eine gespeicherte Prozedur das wird:

Wenn ID = SYSTEM_USER, bringe diese Definition

Ansonsten - foreach Rekord in Benutzer mit GroupRank NOT NULL in der Reihenfolge der Gruppenrang, wenn IS_MEMBER (ID) = 1, diese Definition (falls vorhanden)

Ansonsten - die #DefaultGroup Definition (wenn es dort)

Sonst NULL zurück.

Gibt es eine einfache Möglichkeit, dies zu tun?

Antwort

0

Dies scheint als Tabellenfunktion

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 
2

Wenn ich Sie richtig bin zu verstehen, könnte man ähnlich irgendeine Art von Case-Anweisung verwenden, um unter dem einen:

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

zu arbeiten Würde dies den Fall lösen, in dem ein Benutzer Mitglied mehrerer Gruppen ist? – WOPR