无法使用单个存储过程列出所有项目和选定项目

Unable to use a single Stored Procedure for Listing all items and Selected Items

我需要使用 sql 将州名列为清单。也就是说,如果用户第一次登陆该页面,他应该看到所有状态,当他进入编辑模式时,他应该看到所有状态,并且必须检查选定状态。如何使用单个存储过程实现此目的。我试过了

create proc spGetList
AS
Begin
    SELECT DISTINCT A.* 
    FROM State A 
    LEFT JOIN UserPreferedState B ON A.StateId = B.StateId 
    WHERE UserId = 3
End

但问题是我不确定如何在存储过程中添加一个新列(比如 IsSelected)并将值设置为 1(如果选择了该状态,将值设置为 0 是该状态)未选中。

示例:

Table: UserPreferedState

Id  UserId  StateId
-------------------
 1    1        1
 2    1        2
 3    2        1
 4    2        2
 5    3        1

Table: State

Id  StateName
--------------
1   ABC
2   DEF
3   GHI

我希望 userid = 3 时的结果是:

Id  StateName  IsSelected 
--------------------------
1   ABC           1
2   DEF           0
3   GHI           0

我希望 userid = 1 时的结果是:

Id  StateName  IsSelected
-------------------------
1   ABC           1
2   DEF           1
3   GHI           0

尽情享受吧。这也是 fiddle :http://sqlfiddle.com/#!3/217ce/2

CREATE TABLE state (
StateId INT,
StateName VARCHAR(100)  
);

CREATE TABLE userPreferredState (
Id INT,
UserId INT,
StateId INT
); 

INSERT INTO state (StateId, StateName)
VALUES (1, 'ABC'), (2, 'DEF'), (3, 'GHI');

INSERT INTO userPreferredState (Id, UserId, StateId) 
VALUES (1, 1, 1), (2, 1, 2), (3, 2, 1), (4, 2, 2), (5, 3, 1);

CREATE PROCEDURE getStateListForUser @User int
AS
SELECT 
s.StateId AS Id,
s.stateName,
CASE WHEN (ups.UserId = @User) THEN '1' ELSE '0' END AS IsSelected
FROM
State s
LEFT JOIN
UserPreferredState ups ON s.StateId = ups.StateId AND ups.UserId = @User
GO

要运行它,调用:

EXEC getStateListForUser @User = 1
EXEC getStateListForUser @User = 3