2014-03-12 64 views
1

存儲過程我有一個將參數發送以下存儲過程C#應用程序:使用可選參數

@Lot nchar (112)= NULL,    

@Oper nchar (112)= NULL 

SELECT [Lot].Lot, 

lot.Oper 

FROM DB 
where (@Lot is null or (Lot= @Lot)) 
and (@Oper is null or (Oper= @Oper)) 

,如果我離開我的應用程序領域的空白,我不能得到任何結果。

+0

附註:我會推薦** NOT **使用'(N)CHAR(n)'來替代超過3,5個字符的任何內容。 '(N)CHAR(n)'將總是**填滿已定義的-112個字符或224個字節,即使你只想在字符串中存儲「A」。對於超過5個字符的任何內容,我建議使用**可變長度的**字符串類型 - 「VARCHAR(n)/ NVARCHAR(n)'以獲得更好的性能和更少的浪費空間 –

回答

0

我的猜測是你的應用程序肯定是一個「空白」字段將是一個空字符串。最有可能的是,您的代碼將採用該空白字符串並將其作爲參數傳遞給您的存儲過程。因此,您的默認值(NULL)未被使用,而是@Lot和/或@Oper的值爲''

如果是這樣的話,你的SELECT查詢實際上是:

select ... 
from DB 
where Lot = '' 
and Oper = ''; 

檢查空字符串傳遞參數值之前,如果是這樣的話那麼就沒有這些參數傳遞給存儲過程。或者在後端處理(這不會是我的第一選擇,但它仍然是一個選項)。

+0

感謝您的工作,我將它切換爲」得到了預期的結果。我每天花1/2看這個:-) – user3326577

+0

沒問題,很樂意幫忙。這是一個常見的錯誤:-) –