2014-01-08 28 views
0

這裏有一個事情,我有一個存儲過程,它必須從數據庫中選擇產品,但只有那些適合起始產品代碼和完成產品代碼的產品代碼用戶選擇併發送到該程序。使用where子句選擇需要一系列變量的查詢

現在的產品代碼爲VARCHAR處理,且它們可能包含數字和字母,像0101B02A可能是產品代碼,程序必須能夠在用戶選擇的範圍之間進行選擇的所有值。

我遇到了這樣的麻煩where子句做這樣的:

... 
SELECT ... 
WHERE ... AND 
ProductCode >= @IniProCod 
AND 
ProductCode <= @FinProCod 
... 

可用的產品代碼通過返回唯一可用的產品代碼的前一個查詢顯示給用戶,所以應該不存在問題與不存在的價值。

我也嘗試進行評價,如文本,雖然他們收到由程序反正VARCHAR處理,而且由於這是一個動態的SQL查詢中,它實際上看起來是這樣的:

... 
SELECT ... 
WHERE ... AND 
ProductCode >= '''[email protected]+''' 
AND 
ProductCode <= '''[email protected]+'''' 
... 

,當我嘗試要執行它,它會返回第一行或一組與我發送給過程的實際值很少無關的行,所以我甚至不認爲它將值全部作爲字符串進行比較。

我忽略了與該問題無關的代碼,查詢實際上沒有這個範圍where子句正常工作。

那麼有什麼想法?

編輯:

我也使用BETWEEN嘗試,但得到了同樣的結果。

而且我非常肯定這是不比較,即使它們被聲明爲VARCHAR處理變量文本和我使用他們撇號,而這僅僅是發生在此過程。我在一個乾淨的select查詢中測試了這個相同的子句,它的行爲應該像它應該那樣,比較每個字符的內容。如果我將初始值分別設置爲029,它將給出從0129的範圍,它們是包含在該範圍內的值,但是當這些相同的值被賦予存儲過程時,它將返回範圍從01這是第一個值,到03F,這對我沒有意義。

回答

1

很可能,您需要讓應用程序根據開始的&結束碼找出產品代碼列表,然後將該列表發送到存儲過程。你的SQL只會包含類似AND ProductCode IN (@myProductCodeList)的東西。

+0

這是一個好主意,如果你致力於這些代碼。 SQL Server當然可以按文本進行排序和比較。但是,如果你的代碼不在數據庫中排序文本以同樣的方式有序......好吧,那麼範圍不打算匹配。如果您可以像iKnowKungFoo所說的那樣將列表推到「IN」,那可能是一個非常直接的答案。 –

+0

你的回答是有道理的,我並沒有太多的控制程序調用之外的應用程序,所以我不知道我是否能夠在執行程序之前排除它,這就是爲什麼我是而是專注於查詢。 – user1676874