Q:

Find rows in a table that matches by a table valued list

I have two tables like the below, I want to get all users in tbl_UserPermission who has ALL the permissionid,enabledstatus combination as defined in tbl_Permission.
tbl_userpermission sample data
tbl_Permission sample data
CREATE TABLE tbl_UserPermission 
(
     userid INT
    ,permissionId INT
    ,enabledstatus INT
)

INSERT INTO dbo.tbl_UserPermission VALUES (100,1,0),(100,2,1),(100,3,2),(100,4,2),(200,1,2),(200,2,0),(200,3,1),(300,1,2),(300,2,0),(300,3,1),(300,5,2)

CREATE TABLE dbo.tbl_Permission
(
     permissionId INT
    ,enabledstatus INT
)

INSERT INTO dbo.tbl_Permission
VALUES (1,2),(2,0),(3,1)

Expected Result for the query will be 200,300 as they are users who have the same (permissionId,enabledstatus) combination as defined in the tbl_Permissiontable. 
Another Scenario
DELETE FROM tbl_permission;
INSERT INTO dbo.tbl_Permission
VALUES (1,2),(2,0),(3,0)
Expected Results: No userid is returned as there are no users who have the same (permissionid,enabledstatus) combination as in tbl_permission now

A:

Join the table tbl_Permission to tbl_UserPermission, then group by userid and set a condition in the HAVING clause:
with cte as (select count(*) total from tbl_Permission)
select u.userid
from tbl_Permission p inner join tbl_UserPermission u
on u.permissionId = p.permissionId and u.enabledstatus = p.enabledstatus
group by u.userid
having count(u.permissionId) = (select total from cte)

See the demo.
Results:
> | userid |
> | -----: |
> |    200 |
> |    300 |

