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

商业案例:
Table Specialties包含所有Specialties,每个记录都有一个位字段,用于说明它是处于活动状态还是处于非活动状态。我们始终只以下拉列表的形式显示该表中的活动记录。用户可以选择一个专业,以后可以将其停用。新要求是能够拉动该非活动记录以及结果集中的所有活动记录。

这就是我认为应该执行的操作:
如果没有为我要拉拔的人员分配专业,则所有活动记录都将填充下拉列表。
如果有一个与我要提拔的人员相关的不活动的专业知识,则我会将该specialidID作为参数发送到存储的proc中,并返回该不活动的记录以及活动记录以填充下拉列表。

以下是到目前为止我得到的:
到目前为止,如果我不传递任何SpecialtyId,那么我将返回正在运行的活动专业记录。当我发送specialityId参数时,它仅返回一个非活动记录,而不返回其他活动记录的其余部分。我还需要其余的活动记录以及该一条非活动记录。

   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;

08-25 12:41
查看更多