2013-12-15 143 views
1

其中一個參數是位數據類型。儘管DB表中的值只有0和1,但從接口發送參數時,它也可以爲空。該foll。查詢給出0行。我懷疑這個問題可能與這個位參數有關。使用位參數的存儲過程

ALTER PROCEDURE GETDATA (@username VARCHAR(50), 
         @profileid UNIQUEIDENTIFIER, 
         @status BIT) 
AS 
    BEGIN 
     IF @username = '' 
     SET @username = NULL 
     ELSE 
     SET @username = '%' + @username + '%' 

     IF @profileid = '00000000-0000-0000-0000-000000000000' 
     SET @profileid = NULL 

     SELECT u.* 
     FROM tbluser u 
     WHERE u.deleted = 0 
      AND (u.username like @username 
        OR u.username IS NULL) 
      AND (u.profileid = @profileid 
        OR u.profileid IS NULL) 
      AND (u.status = @status 
        OR (@status IS NULL 
         AND u.status IS NULL)) 
    END 

--execute GetData null,null,null 

期望輸出

UserId EmpId Username profileid status 
-------------------------------------- 
1  101 user1  10  1 
+0

看起來不錯。它是否正常工作取決於您尚未告訴我們的所需語義。請顯示您希望返回的那一行數據。 –

+0

@Martin,我已經更新了我的問題,預期產出 – Ruby

回答

1

status列的邏輯是從其他兩個不同的,當你在NULL傳遞(因爲你說在數據庫中的值總是0總是會失敗, 1)。

你真的想要這個邏輯嗎?

WHERE u.deleted = 0 
     AND (u.username = @username OR @username IS NULL) 
     AND (u.profileid = @profileid OR @profileid IS NULL) 
     AND (u.status = @status OR @status IS NULL) 

這會將NULL輸入參數視爲不對列進行任何過濾。

+0

是的。這是我想要的,因爲這個參數來自下拉菜單,它有3個項目 - 一個值爲0,另一個爲1,最後一個 - 沒有任何值。因此是空值。 – Ruby

1

你的程序有很多問題。第一種是這樣的組合:

IF @username = '' 
    SET @username = NULL 
ELSE 
    SET @username = '%' + @username + '%' 

隨後

u.username = @username 

如果空值被髮送時,這個代碼將執行:

SET @username = '%' + @username + '%' 

這將使@username = NULL,並且該查詢會因爲您不能擁有而崩潰

where somefield = null 

你必須有

where somefield is null 

有類似的問題,傳遞一個空字符串。現在,假設'fred'的值作爲用戶名傳遞。這再一次執行:

SET @username = '%' + @username + '%' 

這:

u.username = @username 

成爲

u.username = '%fred%' 

你可能想等代替等號有字。

對於@status變量,如果您的數據庫沒有空值,請不要查找任何值。如果你得到一個傳遞給過程,你可能想使用動態SQL或案例結構。像這樣的東西應該工作。

and u.status = case when @status is not null then @status 
else u.status end 
+0

謝謝。但我有相同的方法正常工作的程序。它只是這個有點作爲一個參數。 – Ruby