はじめに :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データベースに適切なユーザー定義のデータ型を作成することだけです。
注:ここに直接記述されたコード。タイプミスがある可能性があります。