2012-09-07 37 views
0

我有一個角色和權限表,名爲role_permissions。TSQL循環不存在

對於每個角色,如果該角色尚未擁有該權限,我想插入一個新權限。我的循環的問題是,只有一行(角色)更新。循環似乎沒有正確地重新評估每個循環中的子查詢(它找到沒有權限的第一個角色)

DECLARE @role_id INT 

SET @role_id = (SELECT TOP 1 role_id FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 

WHILE @role_id IS NOT NULL 
BEGIN 

INSERT INTO p_role_permissions (role_id, permission_id) VALUES(@role_id, 57) 
-- does not appear to evaluate correctly (works only on the first loop) 
SET @role_id = (SELECT TOP 1 role_id FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 

END 

回答

0

您不需要循環。您可以在一個插入語句中執行此操作。

;WITH RolesToAdd 
    AS (SELECT role_id 
     FROM p_role_permissions /*Would be better to use a roles table here */ 
     EXCEPT 
     SELECT role_id 
     FROM p_role_permissions 
     WHERE permission_id = 57) 
INSERT INTO p_role_permissions 
      (role_id, 
      permission_id) 
SELECT role_id, 
     57 
FROM RolesToAdd 
0

好讓這裏的一些假設,但我相信你可能只是這樣做:

找那些沒有角色有權限57:

INSERT INTO p_role_permissions (role_id, permission_id) 
    SELECT 
     rp.Id, 
     57 
    FROM 
     (SELECT 
      r.Id 
     FROM roles as r 
     LEFT OUTER JOIN p_role_permissions as rp 
     ON r.Id = rp.Role_Id AND rp.Permission_Id = 57 

     WHERE r.Id IS NULL) as nr 
0
INSERT INTO p_role_permissions (role_id, permission_id) (SELECT role_id, 57 FROM p_role_permissions WHERE NOT EXISTS (SELECT NULL FROM p_role_permissions WHERE permission_id = 57)) 
+0

你' NOT EXISTS'子查詢不以任何方式與外部查詢相關。 –

0
MERGE INTO p_role_permissions 
USING (SELECT DISTINCT roleid, 57 FROM p_role_permissions) AS src 
ON (p_role_permissions) 
WHEN NOT MATCHED THEN 
    INSERT p_role_permissions (role_id, permission_id) 
    VALUES (role_id, 57);