我在数据库中有两个名为Customer和orders的表。在我的ASP.NET页面中,我有复选框表示这两个表中的字段。
用户可以从复选框中进行选择(Firstname,OrderitemName是强制性的)。根据选中的复选框,我需要生成一个SQL查询。当用户按下提交按钮时,查询将返回结果,并使用从CustomerType下拉列表中应用的过滤器。
为此,我检查了我的代码中是否选中了复选框,并将其作为存储过程中的位类型传递。我的存储过程是,
CREATE PROCEDURE [dbo].[GetCustomerDetails]
@LastName BIT,
@Phone BIT,
@Email BIT,
@Quantity BIT,
@OrderedDate BIT,
@ReturnPolicy BIT,
@CustomerType nvarchar(40)
AS 开始 设置NOCOUNT ON DELCARE @Sql NVARCHAR(4000)
SET @Sql='SELECT c.FirstName,o.OrderItemName'
IF @LastName =1
BEGIN
SET @Sql=@sql+'c.LastName,'
END
IF @Phone =1
BEGIN
SET @Sql=@sql+'c.Phone,'
END
IF @Email =1
BEGIN
SET @Sql=@sql+'c.Email,'
END
IF @Quantity =1
BEGIN
SET @Sql=@sql+'o.Quantity,'
END
IF @OrderDate =1
BEGIN
SET @Sql=@sql+'o.OrderDate,'
END
IF @ReturnPolicy =1
BEGIN
SET @Sql=@sql+'o.ReturnPolicy'
END
SET @sql=@sql +' ' +'from Customer c inner join Order o on c.CustomerId=o.CustomerID where c.CustomerType =' + '@CustomerType'
EXEC(@sql)
END
现在,在asp.net页面的复选框中添加了许多其他表格列(30列)。这只是添加太多的位类型变量,如果条件检查那些位类型变量,并根据存储过程中的那些位类型变量将其连接到@sql。有没有更好的方法来实现这一目标?请建议。
答案 0 :(得分:0)
首先创建一个表,让我们称之为具有3列的过滤器,如下所示:
1. filter varchar(100)
2. inputBit bit
3. condition (this can be any condition, may be date time or any incremental int)
现在插入过滤条件以及所有列的输入位:这将如下所示:
c.LastName 1 11
c.Phone 1 11
c.Email 1 11
o.Quantity 1 11
o.OrderDate 1 11
o.ReturnPolicy 1 11
在上面的示例中,我将条件视为int,并且其特定实例的值为11,对于下一个实例,它可以是其他实例。
现在使用以下查询:
DECLARE @Sql NVARCHAR(4000)
declare @var1 varchar(100)
declare @var2 bit
SET @Sql='SELECT c.FirstName,o.OrderItemName'
declare cur_filtered_view cursor for
select filter,inputBit from filters where condition = 11
open cur_filtered_view
fetch next from cur_filtered_view into @var1,@var2
while @@fetch_status = 0
begin
if(@var2 = 1)
begin
set @Sql = @Sql+','+@var1
end
fetch next from cur_filtered_view into @var1,@var2
end
close cur_filtered_view
deallocate cur_filtered_view
set @Sql = @Sql + ' from Customer c inner join Order o on c.CustomerId=o.CustomerID where c.CustomerType =' + '@CustomerType'
exec (@Sql)
现在,如果要添加任何新过滤器,则必须将其作为位从前端传递到Proc。此后唯一需要的更新是在filters表中为这些新过滤器添加一行,并在每个proc调用中插入过滤器表中的相关值。