Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何编写可选参数的查询_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 如何编写可选参数的查询

Sql server 2005 如何编写可选参数的查询,sql-server-2005,tsql,Sql Server 2005,Tsql,朋友们好,我正在为我的项目遵循三层架构 表示层、业务逻辑层,最后是数据库层 我的问题是,我正在为我的项目创建一个搜索功能,我需要通过一个搜索查询方法发送参数,该方法将在业务逻辑层上创建 我将通过调用某个方法从表示层发送参数,这些参数将用于业务逻辑层的方法以进行适当的查询 不确定每次发送多少个参数,我的意思是参数是可选的 所以我的问题是,我应该如何发送这些可选参数,以便在业务逻辑层上准确地获取require参数 最好的方法是什么,我正在asp.net中编程如果您使用业务实体,请使用mask=1、2

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


最好的方法是什么,我正在asp.net中编程如果您使用业务实体,请使用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,请使用null-able-don-increment-mask-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对于选择,使用两个遮罩选择,并在其中选择

/*
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)

这似乎是存储过程,但我想知道对于简单的参数化查询,我想知道我应该如何将可选参数传递给方法,以及我应该如何只使用必需的参数我应该使用字典还是任何其他集合…@NeareorToDotnet我已经更新了我的答案。业务实体上的用户自定义属性。我已更新了我的应答标点符号-它位于。。。