SQL SP:如何 return 一个非活动记录和一个活动记录

SQL SP: How to return one inactive record along with active records

我正在研究这个特殊的 sql 存储过程,其中的业务案例如下:

商业案例: Table Specialties 包含所有 Specialties,并且每个记录都有一个位域,表明它是活跃的还是不活跃的。我们总是以下拉列表的形式仅显示 table 中的活动记录。用户可以 select 一种稍后可以停用的专业。新要求是能够将非活动记录与结果集中的所有活动记录一起提取。

我认为我应该这样做: 如果没有为我拉起的人分配专业,那么下拉列表将由所有活动记录填充。 如果有与我拉起的人相关的非活动专业,那么我将该专业 ID 作为参数发送到存储过程中,并且 return 将非活动记录与活动记录一起填充下拉列表。

以下是我目前得到的: 到目前为止,如果我没有传递任何 specialtyId,那么我正在 returning 有效的专业记录。当我发送一个 specialtyId 参数时,它只是 return 一个非活动记录,而不是其他活动记录的其余部分。我还需要其余的活动记录以及那条非活动记录。

   DECLARE  @specialtyId  INT = null;
  BEGIN
    IF isnull(@specialtyId,'')=''
      BEGIN
        SELECT SpecialtyID AS Id, Specialty AS Name
          FROM dbo.Specialties
         WHERE IsActive = 1
         ORDER BY Specialty;
      END
    ELSE 
      BEGIN
        SET @specialtyId = @specialtyId ;

        SELECT s.SpecialtyID AS Id, s.Specialty AS Name
          FROM dbo.Specialties s
         WHERE specialtyId = @specialtyId
         GROUP BY s.Specialty, s.SpecialtyID
         HAVING (Specialty IS NOT NULL)
            AND (max(SpecialtyID) IS NOT NULL)
         ORDER BY Name;
      END
  END

在我看来,这可以在没有任何 IF 的情况下完成:

SELECT  s.SpecialtyID AS Id, 
        s.Specialty AS Name
FROM dbo.Specialties s
WHERE specialtyID = @specialtyId
OR IsActive = 1;

您可以在 where 子句中完成所有操作。在下面的例子中,它检查是否传入了@specId 并且 select 仅是该 ID 或非活动记录,或者如果 @specId 为 0,则仅 select 活动记录。

    IF OBJECT_ID('tempdb..#tmptest') IS NOT NULL
    DROP TABLE #tmptest
CREATE TABLE #tmptest
(
    SpecialtyID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    , SpecialtyName VARCHAR(50) NOT NULL
    , IsActive BIT NOT NULL DEFAULT (0)
)

INSERT INTO #tmptest
VALUES 
    ('Peditrician', 1)
    , ('Rad Tech', 1)
    , ('Surg Nurse', 1)
    , ('Peds Nurse', 1)
    , ('Cardio Doctor', 0)
    , ('Cardio Nurse', 1)
    , ('Test Doctor', 1)

DECLARE @SpecID INT = 0

SELECT *
FROM #tmptest
WHERE 
    ( 
        (@SpecID > 0 AND (SpecialtyID = @SpecID OR IsActive = 0))
        OR
        (@SpecID = 0 AND IsActive = 1)
    )