sql >> データベース >  >> RDS >> Sqlserver

SQLパラメータの文字列配列をSQLのIN句に渡す方法

    はじめに :OPはすでに回答を受け入れていますが、これから示すアプローチの方が受け入れられたアプローチよりも優れていると信じているので、自分の経験を共有する方がよいと思いました。

    配列をSQLサーバーデータベースに渡す最良の方法は、user defined table typeを使用することです。 およびc#DataTable 。あなたの場合、1次元の文字列配列を渡したいので、かなり簡単です:

    まず、データベースにユーザー定義のテーブルタイプを作成する必要があります。

     CREATE TYPE dbo.StringArray As Table (
        StringItem varchar(50) -- you can use any length suited for your needs
    )
    

    次に、c#コードでデータテーブルを作成する必要があります:

    DataTable dt = new DataTable();
    dt.Columns.Add("StringItem", typeof(System.String));
    

    次に、ストアドプロシージャを変更して、このデータ型をパラメータとして受け入れるようにします。

    ALTER proc [dbo].[sp_Accessories]
    (  
    @Mode varchar(50)=null,
    @id int=null,
    @brand varchar(50)=null,
    @department varchar(MAX)=null,
    @season varchar(50)=null,
    @groupname varchar(MAX)=null,
    @styles varchar(50)=null,
    @combo dbo.StringArray Readonly=null, -- NOTE THIS CHANGE
    @combo_color nvarchar(max)=null,
    )
    as
    if @Mode='getsizewise'
    begin
    select Sizes,SUM(Quantity) from tbl_SizeBreakup where ([email protected]) and
    ([email protected]) and ([email protected]) and ([email protected]) and ([email protected]) 
    and ([email protected]) and (Total_Add_Qty='Total Quantity') 
    and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
    Group By Sizes
    end
    

    次に、文字列配列をc#コードのdataTableに変換する必要があります。

    foreach (string s in YourStringArray) {
        string[] temp = {s};
        dt.Rows.Add(temp);
    }
    

    DataTableをパラメータとしてストアドプロシージャに追加します:

    System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
    sp.SqlDbType = SqlDbType.Structured;
    sp.Value = dt;
    sp.ParameterName = "@Combo";
    cmd.Parameters.Add(sp);
    

    ビルドして実行します。

    このアプローチは、SQLユーザー定義関数を使用するよりもパフォーマンスが優れているはずであり、さまざまなデータ型にも使用できます。これは、これを使用する最も良い理由の1つです。日付の配列を渡す必要があるシナリオを考えてみましょう。csvアプローチでは、各文字列を日付に変換するためにsqlが必要ですが、このアプローチでは、日付をそのまま渡すことができます。文字列に変換してから日付に戻す必要はありません。また、2次元の配列または辞書を渡すことができます。必要なのは、SQLデータベースに適切なユーザー定義のデータ型を作成することだけです。

    注:ここに直接記述されたコード。タイプミスがある可能性があります。



    1. MySQLで数値の範囲を生成する

    2. アイドル状態のPostgreSQL接続のタイムアウトはありますか?

    3. Postgresql9.2pg_dumpバージョンの不一致

    4. SESSION_CONTEXT()がSQLServerでどのように機能するか