1

Customer と orders という名前のデータベースに 2 つのテーブルがあります。私の ASP.NET ページには、これら 2 つのテーブルのフィールドを表すチェックボックスがあります。ここに画像の説明を入力

ユーザーはチェックボックスから選択できます (Firstname,OrderitemName は必須です)。選択したチェックボックスに基づいて、SQL クエリを生成する必要があります。ユーザーが [送信] ボタンを押すと、クエリは CustomerType ドロップダウン リストからフィルターが適用された結果を返します。

このために、コードでチェックボックスが選択されているかどうかを確認し、ストアド プロシージャでビット型として渡しました。私のストアドプロシージャは、

CREATE PROCEDURE [dbo].[GetCustomerDetails]     
@LastName BIT,
@Phone BIT,
@Email BIT,
@Quantity BIT,
@OrderedDate BIT,
@ReturnPolicy BIT,
@CustomerType nvarchar(40)  

AS BEGIN SET 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)

終わり

現在、asp.net ページのチェックボックスに多くのテーブル列 (30 列) が追加されています。これは、あまりにも多くのビット型変数を追加しているだけであり、これらのビット型変数をチェックして、ストアド プロシージャ内のビット型変数に基づいて @sql に連結する場合の条件です。これを達成するためのより良い方法はありますか?提案してください。

4

1 に答える 1

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 にビットとして渡す必要があります。その後必要となる唯一の更新は、フィルター テーブルにこれらの新しいフィルターの行を追加し、各 proc 呼び出しで関連する値をフィルター テーブルに挿入することです。

于 2012-10-03T08:46:47.800 に答える