2013-11-04 43 views
1

我有一個sql服務器表,其中有一個int列,名爲[type],它可以爲空。我有以下存儲過程獲取類型作爲輸入:其中在基於輸入參數的TSQL條件

@Jobtype VARCHAR(50) = '', 
    @Language INT 
AS 
BEGIN 
    SELECT [TabId]  
     ,CASE 
      WHEN @Language = 2 THEN [TabNameTextLang2] 
      ELSE [TabNameTextLang1] 
     END AS TabName 
     ,CASE 
      WHEN @Language = 2 THEN [PageTitleLang2] 
      ELSE [PageTitleLang1] 
     END AS PageTitle 
     ,[TabLink] 
     ,[Type] 
     ,[Priority] 
     ,[DutyStationId] 
     ,[DateCreated] 
     ,[DateModified] 
     ,[Deleted] 
    FROM dbo.hr_Tabs 
    WHERE Deleted = 0 AND 
    ((@Jobtype = '' and [Type] is null) or ([Type] = CASt(@Jobtype as int))) 

END 

此表有一行,其中類型爲空。我希望當我將@jobtype作爲''傳遞時,那麼只有該行被選中,否則行將按其類型顯示。但是,當我試圖通過上面的存儲過程的參數,如

exec myproce '', 1 

我得到的所有記錄

請提出如何篩選基於類型的記錄在我的情況

+1

你得到所有的行,或只是所有的行'類型'爲0? CAST(''as int)'產生一個0,所以條件的第二部分可能是真的。 –

+0

類型爲0或null的所有行 – DotnetSparrow

回答

2

用途:

((@Jobtype = '' and [Type] is null) or 
(@Jobtype <> '' and [Type] = CAST(@Jobtype as int))) 

(我通常也建議使用NULL而不是空字符串作爲您的特殊標記值)

+0

在這種情況下,我將使用以下內容? (@Jobtype爲null,[Type]爲空)或 (@Jobtype不爲null,[Type] = @Jobtype)) – DotnetSparrow

+0

@DotnetSparrow - 是的,這是行得通的。 –

-1

替代

FROM dbo.hr_Tabs 
CROSS APPLY (select [Type] as dummy intersect select nullif(@Jobtype, '')) x 
WHERE Deleted = 0 

爲了得到精確的匹配先生。史密斯的回答(邏輯是相同的):

FROM dbo.hr_Tabs 
WHERE Deleted = 0 and exists 
(select [Type] as dummy intersect select nullif(@Jobtype, '')) 
+1

正常程序是在投票時進行評論。這個語法是有效的 –

+0

我被這個[靈感](http://stackoverflow.com/questions/19682956/avoiding-if-else-due-to-variable-been-null/19683011#19683011)通過@MartinSmith –