存儲過程我有一個將參數發送以下存儲過程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))
,如果我離開我的應用程序領域的空白,我不能得到任何結果。
存儲過程我有一個將參數發送以下存儲過程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))
,如果我離開我的應用程序領域的空白,我不能得到任何結果。
我的猜測是你的應用程序肯定是一個「空白」字段將是一個空字符串。最有可能的是,您的代碼將採用該空白字符串並將其作爲參數傳遞給您的存儲過程。因此,您的默認值(NULL
)未被使用,而是@Lot
和/或@Oper
的值爲''
。
如果是這樣的話,你的SELECT
查詢實際上是:
select ...
from DB
where Lot = ''
and Oper = '';
檢查空字符串傳遞參數值之前,如果是這樣的話那麼就沒有這些參數傳遞給存儲過程。或者在後端處理(這不會是我的第一選擇,但它仍然是一個選項)。
感謝您的工作,我將它切換爲」得到了預期的結果。我每天花1/2看這個:-) – user3326577
沒問題,很樂意幫忙。這是一個常見的錯誤:-) –
附註:我會推薦** NOT **使用'(N)CHAR(n)'來替代超過3,5個字符的任何內容。 '(N)CHAR(n)'將總是**填滿已定義的-112個字符或224個字節,即使你只想在字符串中存儲「A」。對於超過5個字符的任何內容,我建議使用**可變長度的**字符串類型 - 「VARCHAR(n)/ NVARCHAR(n)'以獲得更好的性能和更少的浪費空間 –