1

私は多数のストアド プロシージャを持っており、それらはすべて同様の選択ロジックを実行します。

WHERE
 @CustGroup = 'X' AND CUST_TYPE in ('X1', 'X2', 'B1', 'C1')
OR
 @CustGroup = 'Y' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2')
OR
 @CustGroup = 'Z' AND CUST_TYPE in ('X2', 'Y2', 'D1', 'D2')
OR
 @CustGroup = 'MAIN' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2', 'X2', 'Y2', 'D1', 'D2')

次のことは可能ですか。

A)

これらの「in」選択を何らかの変数に入れますか?

@XGroup = 'X1', 'X2', 'B1', 'C1'
WHERE
 @CustGroup = 'X' AND CUST_TYPE in (@XGroup)

もしそうならB)

これらの「イン」セレクションをどこかに集中させて、異なる sproc で再利用できるようにしますか?

4

3 に答える 3

1

次のように、一時テーブルまたはテーブル変数を使用してメイン クエリを簡素化できます。

DECLARE @cgt TABLE(CustGroup VARCHAR(5), CustType VARCHAR(5));

INSERT  @cgt VALUES('X','X1'), ('X','X2'), ('X','B1'), ('X','C1');
INSERT  @cgt VALUES('Y','Y1'), ('Y','A1'), ('Y','B2'), ('Y','C2');
INSERT  @cgt VALUES('Z','X2'), ('Z','Y2'), ('Z','D1'), ('Z','D2');
INSERT  @cgt VALUES('MAIN','Y1'), ('MAIN','A1'), ('MAIN','B2'), ('MAIN','C2')
, ('MAIN','X2'), ('MAIN','Y2'), ('MAIN','D1'), ('MAIN','D2');

SELECT  t.* 
FROM    MyTable t
JOIN    @cgt cgt    ON  cgt.CustGroup = @CustGroup
                    AND cgt.CustType = t.CUST_TYPE;
于 2012-07-01T16:27:15.607 に答える
1

Bに対応して、

テーブルを作成する

create table CUST_TYPE_LOOKUP (
  key varchar(10) not null,   -- or whatever type
  value varchar(10) not null  -- or whatever type
);

create index foo on CUST_TYPE_LOOKUP (key);

データを入力してください。

キー1 X1
キー1 X2
キー1 B1
キー1 C1
キー2 Y1
キー2 A1
キー2 B2
キー2 C2

次に使用します。

WHERE
  @CustGroup = 'X' AND CUST_TYPE in (select value from CUST_TYPE_LOOKUP where key = 'Key1')
 OR
  @CustGroup = 'Y' AND CUST_TYPE in (select value from CUST_TYPE_LOOKUP where key = 'Key2') 
于 2012-07-01T12:35:40.967 に答える
0

あなたが説明している種類の配列は、TSQL では実際には不可能ですが、できることはいくつかあります。動的 SQL を使用して選択基準を 1 回作成し、そのビットを再利用して残りのクエリを作成できます。動的 SQL には、パフォーマンスとセキュリティの問題があります (外部ユーザーがクエリ文字列を変更できるようにする場合)。最も簡単な方法は、共通の選択基準に基づいてビューまたはビューのセットを作成し、それらのビューに対して後でクエリを INNER JOIN することだと思います。これにより、ビュー内のロジックを 1 か所ですばやく変更し、それに基づく他のクエリに影響を与えることができます。たとえば、上記の選択基準がすべての「上位 10」クライアントに適用される場合:

CREATE VIEW vTopTenCustomers
AS
SELECT CustomerID
FROM Customers
WHERE
 CustGroup = 'X' AND CUST_TYPE in ('X1', 'X2', 'B1', 'C1')
OR
 CustGroup = 'Y' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2')
OR
 CustGroup = 'Z' AND CUST_TYPE in ('X2', 'Y2', 'D1', 'D2')
OR
 CustGroup = 'MAIN' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2', 'X2', 'Y2', 'D1', 'D2')

次に、上位 10 件のみに対してクエリを実行する必要がある場合は、そのビューに参加します。

SELECT *
FROM Customers
INNER JOIN vTopTenCustomers
    ON Customers.CustomerID = vTopTenCustomers.CustomerID

インデックスには注意が必要です。おそらく、CustGroup と Cust_Type に非クラスター化インデックスを使用して、ビューのパフォーマンスが低下しないようにする必要があります。

于 2012-07-01T15:14:30.493 に答える