2013-03-27 32 views
2

需要您對複選框的幫助。 這裏是我的代碼:帶有複選框的SQL SERVER示例

CREATE PROCEDURE stad_list 

@inp_location_code numeric (3,0) = -1 
@inp_item_code_bgn numeric (5,0) = -1 
@inp_item_code_end numeric (5,0) = -1 
@inp_shipped numeric (2,0) = 0, --checkbox, if it is checked then returns the items in table which were shipped (value in table is 1) 
@inp_check numeric (2,0) = 0, --checkbox, if it is checked then returns data which is still in process of checking for availability in warehouse (value in table is 0) 
@inp_not_ship numeric(2,0) = 0 --checkbox, if it is checked then returns data which had not been shipped during some problems (valuein table is 2) 

AS 

BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SELECT as varchar (3000) = '' 
    DECLARE @WHERE as varchar (1000) = '' 

    IF (@inp_location_code != -1) 
     SET @WHERE = @WHERE + ' WHERE [dbo].item.location =' + CONVERT(varchar,@inp_location_code) 

    IF (@inp_item_code_bgn != -1) 
     SET @WHERE = @WHERE + ' AND [dbo].item.code>=' + CONVERT(varchar, @inp_item_code_bgn) 

    IF (@inp_item_code_end != -1) 
     SET @WHERE = @WHERE + ' AND [dbo].item.code<=' + CONVERT(varchar, @inp_item_code_end) 

    IF (@inp_shipped = 1) 
     SET @WHERE = @WHERE + ' AND [dbo].item.ship = 1' 

    IF (@inp_check = 1) 
     SET @WHERE = @WHERE + ' AND [dbo].item.ship = 0' 

    IF (@inp_not_ship = 1) 
     SET @WHERE = @WHERE + ' AND [dbo].item.ship = 2' 



    SET @SELECT = @SELECT + ' 
     SELECT 
      [dbo].item.name as ''NAME'', 
      [dbo].item.location as ''LOCATION'', 
      [dbo].item.code as ''CODE'', 
      [dbo].item.ship as ''STATUS'' 
     FROM [dbo].item ' 
     + @WHERE 


    EXEC (@SELECT) 

    RETURN @@ROWCOUNT 

END 

它,當我只檢查一個複選框工作正常,但不能得到任何數據,同時它的2進行檢查。那麼,如果我想檢查兩個複選框,該怎麼辦?有什麼建議麼?

這裏是我的表

Id  Item_code Item_name Item_location Item_ship 
1  14789  Juice  Tokyo   0 
2  14785  Boots  Tokyo   2 
3  98744  Hat   Osaka   0 
4  36987  Socks  Kyoto   1 

而且有三個複選框

  • 發貨

  • 檢查

  • 不發貨

如果我託運發貨後輸出會是這樣:

Id  Item_code Item_name Item_location Item_ship 
    4  36987  Socks  Kyoto   1 

,但我想爲前這樣做。當我檢查發貨和檢查,然後輸出將是:

Id  Item_code Item_name Item_location Item_ship 
    1  14789  Juice  Tokyo   0 
    3  98744  Hat   Osaka   0 
    4  36987  Socks  Kyoto   1 
+0

沒有足夠的信息。需要樣本輸入數據和預期輸出。 – 2013-03-27 10:50:53

+1

用複選框部分的OR替換AND。不要忘記ORed條件下的括號。 – Arvo 2013-03-27 10:56:40

+0

我已經編輯了我的問題與例子,如你問...對不起,如果它太長 – user2082503 2013-03-27 11:01:51

回答

2

使用臨時表作爲參數

IF (@inp_shipped = 1) OR (@inp_check = 1) OR (@inp_not_ship = 1) 
BEGIN 
    IF OBJECT_ID('tempdb.dbo.#Parameters') IS NOT NULL DROP TABLE dbo.#Parameters 
    SELECT * 
    INTO #Parameters 
    FROM (
     SELECT CASE WHEN @inp_shipped = 1 THEN 1 END AS Ship 
     UNION ALL 
     SELECT CASE WHEN @inp_check = 1 THEN 0 END 
     UNION ALL 
     SELECT CASE WHEN @inp_not_ship = 1 THEN 2 END 
     ) p 
    WHERE p.Ship IS NOT NULL  
    SET @WHERE = @WHERE + ' AND [dbo].item.ship IN (SELECT ship FROM #Parameters)' 
END 

爲了獲得更好的性能表(由使用索引查找操作),如果你有在船上列的索引,需要在臨時表上創建索引:

CREATE INDEX x ON #Parameters(ship) 

enter image description here

+0

感謝你的回答,它是行得通的),但你能解釋什麼是'p'以及在這種情況下如何使用OBJECT_ID?先謝謝你! – user2082503 2013-03-28 02:13:33

+0

沒問題.ELECT..INTO創建一個新表(在我的答案中創建臨時表#Parameters)並將查詢結果行插入到它中,但在插入之前我檢查是否存在表。 – 2013-03-28 07:44:19

+0

謝謝,但'p'是什麼? – user2082503 2013-03-28 08:04:01

1

你可以結合你的選擇到這樣的結構:

declare @orcheck varchar(255) 
set @orcheck = 'AND 1=2 (' 

IF (@inp_shipped = 1) 
SET @orcheck = @orcheck + ' OR [dbo].item.ship = 1' 

IF (@inp_check = 1) 
SET @orcheck = @orcheck + ' OR [dbo].item.ship = 0' 

IF (@inp_not_ship = 1) 
SET @orcheck = @orcheck + ' OR [dbo].item.ship = 2' 

set @orcheck = @orcheck + ')' 

這樣,當您選擇了全部3個複選框,在WHERE條款是這樣的:

AND (1=2 
    OR [dbo].item.ship = 1 
    OR [dbo].item.ship = 0 
    OR [dbo].item.ship = 2 
) 

而當沒有什麼選擇,這將是:

AND (1=2 
) 

這是你所期望的,我相信。

+0

謝謝你的回答呢!它也很有用!真的很感謝你的回答) – user2082503 2013-03-28 02:14:06