首页 > 解决方案 > 将参数传递给可以更改查询主体的存储过程

问题描述

我想@empActiveStatus在执行之前传递可以更改查询主体的参数。

请注意, 的值@empActiveStatus将根据用户从应用程序中选择的内容而变化,因此empActiveStatus可能是empActive = 1orempActive = 0(empActive = 1 or empActive = 0)

我要防止的是创建 3 个存储过程,而是创建一个并使用参数来更改查询的主体及其返回的内容。

提前致谢。

情景 1。

CREATE PROCEDURE [dbo].[spcGetEmployees]
    @empID Int,
    @empActiveStatus varchar(50)
AS
    SELECT empLastName, empFirstName 
    FROM vwEmployees 
    WHERE empID = @empID AND empActive = 1  
GO

场景二:

CREATE PROCEDURE [dbo].[spcGetEmployees]
    @empID Int,
    @scenarioActiveStatus varchar(50)
AS
    SELECT empLastName, empFirstName 
    FROM vwEmployees 
    WHERE empID = @empID AND empActive = 0
GO

场景 3:

CREATE PROCEDURE [dbo].[spcGetEmployees]
    @empID Int,
    @scenarioActiveStatus varchar(50)
AS
    SELECT empLastName, empFirstName 
    FROM vwEmployees 
    WHERE empID = @empID AND (empActive = 1 OR empActive = 0) 
GO

场景 4:首选程序:

CREATE PROCEDURE [dbo].[spcGetEmployees]
    @empID Int,
    @scenarioActiveStatus varchar(50)
AS
    SELECT empLastName, empFirstName 
    FROM vwEmployees 
    WHERE empID = @empID AND @scenarioActiveStatus 
GO

标签: sql-serverstored-procedures

解决方案


我不完全确定我理解你在问什么,但我认为你在问如何编写一个存储过程来接受员工活动状态的文本值。让我们假设参数@empActiveStatus可以具有值“活动”(这是empActive= 1)、“非活动”(这是empActive= 0)或“全部”(这是 的任何值empActive)。所以存储过程看起来像:

CREATE PROCEDURE [dbo].[spcGetEmployees]
    @empID Int,
    @empActiveStatus varchar(50)
AS
BEGIN
    SELECT empLastName, empFirstName 
    FROM vwEmployees 
    WHERE empID = @empID 
    AND 
    CASE 
        WHEN @empActiveStatus = 'All' THEN 1 
        ELSE empActive END = 
    CASE 
        WHEN @empActiveStatus = 'All' THEN 1 
        ELSE  
            CASE WHEN @empActiveStatus = 'Active' THEN 1 
            WHEN @empActiveStatus = 'Inactive' THEN 0 
            ELSE -1 
         END 
    END
END;
GO

如果 的值为@empActiveStatus“全部”,我们建立一个条件 1 = 1 以返回所有记录,而不管该empActive值是多少;否则,我们使用在empActive列中找到的值并将值转换为@empActiveStatus列的适当值。


推荐阅读