2016-09-27 168 views
0

我對這個特殊的SQL工作存儲過程沿着這裏的生意情況如下:SQL SP:如何返回一個非活動記錄與活動記錄

商業案例: 表專業包含了所有的專業和每個記錄都有一個字段用於告訴它是活動還是非活動。我們總是僅以下拉的形式顯示該表中的活動記錄。用戶可以選擇以後可以停用的專業。新的要求是能夠將該非活動記錄與結果集中的所有活動記錄一起提取。

以下是我認爲我應該這樣做:如果沒有專門分配給我拉起,然後在下拉將是由所有活動記錄中填充的人 。 如果有一個與我正在拉起的人關聯的非活動專業,那麼我將存儲過程中的該專業ID作爲參數發送,並將該非活動記錄與活動記錄一起返回以填充下拉列表。

下面是我走到這一步: 到目前爲止,如果我不通過任何specialtyId然後我回到這是工作積極專業的記錄。當我發送一個specialtyId參數時,它只是返回一個非活動記錄,而不是其他活動記錄的剩餘部分。我還需要剩下的活動記錄以及那個不活動的記錄。

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 
+0

您使用的是MySQL還是MS SQL Server?他們的sp不兼容... – jarlh

+0

這是應該做的:SET specialtyId = specialtyId; ?? (由於在評論中提及,刪除了@) – Jens

+0

isnull(specialtyId,'')=''您將INT值與空字符串進行比較? – Jens

回答

1

在我看來,這可以在沒有任何IF來完成:

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

亞,但是如果提供了SpecialtyID,則上面只會返回一個不活動的記錄。我需要返回活動記錄以及我們爲其提供專業ID的一個非活動記錄 –

+0

@HereToLearn_否,這不是它的工作原理。你試過了嗎? – Lamak

+0

是的,我試過了,當我通過一個不活躍的specialtyId時,它只是給我返回了一條記錄。 @Lamak –

0

你可以做到這一切在where子句。在下面的情況下,它檢查@specId是否通過並僅選擇該ID或非活動記錄,或者如果@specId是0,則只選擇活動記錄。

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) 
    )