带有复选框的SQL SERVER示例

问题描述:

需要您对复选框的帮助。 这里是我的代码:带有复选框的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

使用临时表作为参数

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

你可以结合你的选择到这样的结构:

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