3

基本的に、私はこのような3つのテーブルを持っています(多対多の関係があります); ここに画像の説明を入力 そして、私はこのように検索しています。

ALTER PROC [dbo].[usp_ContactSearch]  
(  
 @PersonName varchar(60)= '',  
 @MobileNo varchar(20)= '',  
 @Nationlity varchar(50)='' ,
 @ContactTypes varchar(max) = ''
)  
AS  
BEGIN  
   
  SELECT DISTINCT c.ContactId, c.PersonName, ct.ContactType, ct.ContactTypeId
  
  FROM Contact c  
  LEFT OUTER JOIN ContactWithContactType cct
  ON c.ContactId = cct.ContactId
  LEFT OUTER JOIN ContactType ct
  ON cct.CountactTypeId = ct.ContactTypeId
  
  WHERE   
   c.PersonName LIKE CASE WHEN @PersonName='' THEN c.PersonName ELSE '%'+@PersonName+'%' END  
  AND   
   c.MobileNo1 LIKE CASE WHEN @MobileNo='' THEN c.MobileNo1 ELSE '%'+@MobileNo+'%' END  
  AND   
   c.Nationality LIKE CASE WHEN @Nationlity='' THEN c.Nationality ELSE '%'+@Nationlity+'%' END  

END

したがって、デフォルトの結果データは次のとおりです。
ここに画像の説明を入力
したがって、フロント エンドから、私はContactTypesを持っています(これは動的です。つまり、連絡先の種類のテーブルから来ています)。インターフェイスは次のようになります。

ここに画像の説明を入力
ここで、ユーザーがPropertyOwner (ContactTypeId=1) をチェックするたび に、2 番目のチェックボックス、つまりTenant (ContactTypeId=2)をチェックすると、データがフィルタリングされ、 ContactTypeId=1に属する連絡先のみが表示されます。データはさらにフィルタリングする必要があり、ContactTypeId= 1 および 2 に属する連絡先のみが表示されます。同様に、3 番目の ContactType についても、データをさらにフィルタリングする必要があります。 したがって、問題はContactTypesが動的であり、この状況を処理する方法がわかりません。 クエリとパフォーマンスに関するヘルプは非常に高く評価されています。

4

3 に答える 3

0

クエリに分割関数を使用して ContactTypes をフィルタリングすることをお勧めします。たとえば、フォームで誰かが Property Owner と Tenant (contactType = 1, 2) などをチェックすると、ストアド プロシージャにそのまま渡すことができます。

@ContactTypes varchar(max) = '1,2'

次に、作成する必要がある分割文字列関数の 1 つを使用できます。この優れた記事 ( http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings ) を参照できます。単純な文字列分割には記事関数SplitStrings_Modenを使用します。

次に、このようにストアド プロシージャのように使用できます。

And ContactType in (select [item] from SplitStrings_Moden(@ContactTypes , ','))

パフォーマンスに関しては、指定された例は文字列列のテーブルを返します。この場合、パフォーマンスを向上させるために int にキャストできます。しかし、キャストなしでパフォーマンスが妥当な場合は、データセットでテストすることをお勧めします。

于 2013-10-06T19:01:55.937 に答える