如何编写可选参数的查询

时间:2010-08-15 18:11:17

标签: sql-server-2005 tsql

你好朋友我正在为我的项目遵循3层架构我的意思 表示层,业务逻辑层,最后是数据库层 我的问题是我正在为我的项目制作搜索功能,我需要通过搜索查询的方法发送参数,该方法将在业务逻辑层上进行 我是通过调用一些方法从表示层发送参数,这些参数将用于业务逻辑层的方法来进行适当的查询 我不确定每次参数是可选的时候会发送多少参数 所以我的问题是我应该如何发送这些可选参数以准确获取业务逻辑层上的require参数。

最好的方法是什么,我在asp.net编程

1 个答案:

答案 0 :(得分:0)

如果您使用业务实体,请使用自定义属性标记每个属性(mask = 1,2,4,8 ...,required = true / false)。

class Product
{

  [FieldAttribute(Required=true, Mask= 0)] 
  public int Id {get; set;}
...
  [FieldAttribute(Required=false, Mask=1)] 
  public string ProductName { get; set;}    
}

然后你可以使用反射来读取所有必需的属性并将它们传递给sp。如果某些不需要的参数为null(使用Nullable<>),则不增加掩码(mask& = propertyMask)。

使用整数掩码进行部分更新。

/*

    exec dbo.Update_Product @product_id = 1, @quantity = 3, @mask =  0x0004
    exec dbo.Update_Product @product_id = 1, @product_name = 'new name', @comment = 'new comment', @mask =  0x0003

*/


alter proc dbo.Update_Product
    @product_id int        
    ,@product_name nvarchar(100)    = NULL -- 0x0001
    ,@comment nvarchar(255)         = NULL -- 0x0002
    ,@quantity int                  = NULL -- 0x0004
    ,@mask     int               
AS    
    update dbo.Product
    SET 
         ProductName    = CASE WHEN (@mask & 0x0001) > 0 THEN @product_name   ELSE ProductName    END
        ,Comment        = CASE WHEN (@mask & 0x0002) > 0 THEN @comment       ELSE Comment        END
        ,Quantity       = CASE WHEN (@mask & 0x0004) > 0 THEN @quantity       ELSE Quantity       END
    WHERE id = @product_id

2)对于select,请使用两个蒙版(select,and where)

/*
exec dbo.Select_Product @select_mask = 0x0001, @where_mask = 0
exec dbo.Select_Product @select_mask = 0x0003, @where_mask = 0

exec dbo.Select_Product @select_mask = 0x0003, @where_mask = 0x0004, @quantity = 2

*/
alter proc dbo.Select_Product
     @select_mask     int 
    ,@where_mask      int 
    ,@product_name nvarchar(100)    = NULL -- 0x0001
    ,@comment nvarchar(255)         = NULL -- 0x0002
    ,@quantity int                  = NULL -- 0x0004
as
 DECLARE @select varchar(max)
 DECLARE @where varchar(max)
SET @select = 'select Id '

IF  (@select_mask & 0x0001) > 0
    SET @select = @select + ',ProductName'
IF  (@select_mask & 0x0002) > 0
    SET @select = @select + ',Comment'
IF  (@select_mask & 0x0004) > 0
    SET @select = @select + ',Quantity'

SET @select = @select + ' from dbo.Product'

IF @where_mask > 0
    SET @where = ' where ' + CASE WHEN (@where_mask & 0x0001) > 0 THEN 'ProductName = ''' + @product_name  + '''' ELSE ''    END
            + CASE WHEN (@where_mask & 0x0002) > 0 THEN 'Comment = '''  + @comment + ''''  ELSE ''    END
            + CASE WHEN (@where_mask & 0x0004) > 0 THEN 'Quantity = ' + CONVERT(varchar(10), @quantity)   ELSE ''    END

PRINT @select + @where
 exec (@select + @where)