0

条件配列のフィルターを使用して .NET データセットを埋めたいと思います。データセットが大きすぎるため、読み込んで読み込んだ後にフィルター処理できません。C# では、塗りつぶしは次のようになります。

List<int> customerIDs;
...
myAdapter.FillByCustomerIDs(customerIDs);

SQL句を生成するもの

  WHERE CustomerID IN (x,x,x)

x、x、x は customerIDs 配列から取得されます。

このタイプのフィルターを TableAdapter クエリ構成ウィザードに渡す方法が見つかりません。

4

1 に答える 1

1

@sSQL で関数を作成します (パラメーターの長さは 1024 であり、これを増やす必要があることに注意してください)。

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(1024))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT 
        CAST(SUBSTRING(@s, start, 
            CASE 
                WHEN stop > 0 THEN stop-start 
                ELSE 512 
            END) as int) AS s
    FROM Pieces
  )
  GO

およびストアド プロシージャ:

CREATE PROCEDURE [dbo].[GetCustomerIds]
    @ids nvarchar(max),
    @sep char(1)
AS
    SELECT * 
    FROM Customers 
    WHERE CustomerId in 
        (SELECT s FROM dbo.Split(@sep,@ids))
RETURN 0

TableAdapter クエリ構成ウィザードFillByCustomerIdsで、コマンドを上記のストアド プロシージャにバインドします。さて、あなたは次のような使い方をするかもしれません:

List<int> customerIDs = new List<int>() { 1, 2, 3, 4 };
myAdapter
    .FillByCustomerIds(dt, 
    customerIDs.Aggregate<int, string>("", 
        (s, i) => s + i.ToString() + ","), ",");
于 2013-08-01T13:40:44.817 に答える