如果布尔值为true,则选择一个表-SQL Server

时间:2018-12-04 12:38:45

标签: sql sql-server stored-procedures sql-function

我在SQL Server数据库中有一个名为Delivery的主表,在Active Directory中保存了6个不同的角色。

每个角色都需要看到同一张表格,但值不同,一个人可能有多个角色。

我正在尝试在SQL Server中构建一个存储过程,以按其角色返回表。

我有不同的功能通过用户角色返回表,我们称它们为:

GetRole1Deliveries()
GetRole2Deliveries()
GetRole3Deliveries()
GetRole4Deliveries()
GetRole5Deliveries()
GetRole6Deliveries()

我构建了一个过程,该过程为每个角色获取布尔值(位)作为参数, 我想做这样的事情:

CREATE PROCEDURE [dbo].[GetDeliveriesByRole] (@p_role1 bit,@p_role2 bit,@p_role3 bit,@p_role4 bit@p_role5 bit,@p_role6 bit)

AS
BEGIN

if @p_role1=1 select * from GetRole1Deliveries();
union
if @p_role2=1 select * from GetRole2Deliveries();
union
if @p_role3=1 select * from GetRole3Deliveries();
union
if @p_role4=1 select * from GetRole4Deliveries();
union
if @p_role5=1 select * from GetRole5Deliveries();
union
if @p_role6=1 select * from GetRole6Deliveries();



END

有人可以帮助我使其正常工作吗?

2 个答案:

答案 0 :(得分:3)

只需使用一个查询:

select * from GetRole1Deliveries() where @p_role1 = 1
union
select * from GetRole2Deliveries() where @p_role2 = 1
union
select * from GetRole3Deliveries() where @p_role3 = 1
union
select * from GetRole4Deliveries() where @p_role4 = 1
union
select * from GetRole5Deliveries() where @p_role5 = 1;

这假定所有函数都以相同的顺序和兼容的类型返回相同的列。

答案 1 :(得分:0)

其他选择是使用临时变量表​​

DECLARE @Result table ([id] int, [desc] nvarchar(400)) --same estructure of result table

IF (@p_role1 = 1)
BEGIN
    INSERT @Result
    SELECT 1, 'role 1'
END
IF (@p_role2 = 1)
BEGIN
    INSERT @Result
    SELECT 2, 'role 2'
END
IF (@p_role3 = 1)
BEGIN
    INSERT @Result
    SELECT 3, 'role 3'
END
IF (@p_role4 = 1)
BEGIN
    INSERT @Result
    SELECT 4, 'role 4'
END
IF (@p_role5 = 1)
BEGIN
    INSERT @Result
    SELECT 5, 'role 5'
END

SELECT [Id], [desc]
FROM @Result