Если вы используете бизнес-объекты, пометьте все свойства по пользовательскому атрибуту с помощью (mask = 1, 2, 4, 8 ..., обязательный = 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.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)