使用している 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年以降を使用している場合は、その例も追加できます。