3

句に関するこのMySQLの質問に似たケースがありINますが、SQL Serverの場合です。

具体的には、実行可能な SQL 文字列を構築しています。その中には、句内で使用する列挙項目の非常に長いリストIN(IE 1000+) が含まれる可能性があります。

これは、条件の動的リストからフィルタを作成する効率的な方法ですか? または、条件データを一時テーブルに挿入しJOINてから、フィルタリング操作のためにエクスポート テーブルに挿入する必要がありますか?

答えが単純でない場合は、各アプローチの長所と短所をいただければ幸いです。

この質問がされていたら、申し訳ありません。リンクされた MySQL の質問はかなり古いものです。これは SQL Server の重複だと思いますが、見つかりません。

4

2 に答える 2

3

使用している SQL Server のバージョンを教えていただくのを忘れていました。もちろん、新しいバージョンごとに、より効率的な方法で問題を解決するのに役立つ機能が得られます。

SQL Server 2005 以降では、次のような単純なテーブル値関数を使用して結合を実装できます。

CREATE FUNCTION [dbo].[SplitInts]
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN ( SELECT Item FROM ( SELECT Item = x.i.value('(./text())[1]', 'int') FROM 
            ( SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') 
              + '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i)
          ) AS y WHERE Item IS NOT NULL
   );
GO

次に、大きなリストを渡して参加します。

CREATE PROCEDURE dbo.GetData
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT t.col1, t.col2 --, ...
      FROM dbo.DataTable AS t
      INNER JOIN dbo.SplitInts(@List, ',') AS i
      ON t.ColumnID = i.Item;
END
GO

これは素晴らしいことではありません (ここでさまざまなメソッドのパフォーマンスについてブログを書きましたが、5000 未満の値ではほとんど違いはありません) が、アドホックIN (...huge list...)クエリよりも優れたパフォーマンスを発揮する可能性があります。

SQL Server 2008 以降では、テーブル値パラメーターを使用できます。上記と同様に、C# から DataTable などの構造をストアド プロシージャに渡し、結合を実行できます。2008年以降を使用している場合は、その例も追加できます。

于 2012-03-08T19:12:37.257 に答える
1

ステージングテーブルアプローチを提案し、where exists(...)節を使用します。

select * from Employees e
where exists(select 1 from BigEmplCriteriaTable where criteria=e.EmployeeLoc)
于 2012-03-08T19:27:10.183 に答える