ほんの数年遅れましたが、今日、ストアド プロシージャ/UDF のテーブル値パラメーターを発見しました。それらは私が抱えている問題の理想的な解決策ですが、C# から動作させることはできません。
私はUDFを持っています:
CREATE FUNCTION GetSurveyScores
@Survey bigint,
@Question nvarchar(max),
@Area StringList READONLY,
@JobCode StringList READONLY
AS BEGIN
SELECT * FROM SurveyResults WHERE RespondentArea IN (Select val from @Area) AND RespondentJobCode IN (select val from @JobCodes)
END
(StringList は私が作成した型です。これは、nvarchar(256) として定義された val という単一の列を持つテーブル値型です)
次に、SQL Server Management Studio から、次のことができます。
declare @area StringList;
insert into @area(val) values('NW'),('NE'),('SW');
// Get all survey respondent job codes from the SurveyRespondent table.
declare @jobcodes StringList;
insert into @jobcodes select distinct jobcode from dbo.SurveyRespondent;
select * from dbo.GetSurveyScores(3, 'Q3', @area, @jobcodes)
それは見事に機能します。
C# から、このコードを使用して結果 (例外なし) を取得しません: (これをドロップする予定の実際のコードは既に DataTables を使用しているため、DataTables を使用しています)
DataTable areas = new DataTable("StringList");
areas.Columns.Add("val");
areas.Rows.Add("NW"); areas .Rows.Add("NE"); areas .Rows.Add("SW");
DataTable jobcodes = new DataTable("StringList");
jobcodes.Columns.Add("val");
jobcodes.Rows.Add("JC1"); jobcodes .Rows.Add("JC2");
SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.GetSurveyScores(3, 'Q3', @area, @jc)", connection);
cmd.Parameters.AddWithValue("@area", areas);
cmd.Parameters["@area"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@area"].TypeName = "StringList";
cmd.Parameters.AddWithValue("@jc", jobcodes);
cmd.Parameters["@jc"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@jc"].TypeName = "StringList";
DataTable results = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
da.Fill(results);
}
Console.WriteLine(results.Rows.Count);
最後の行には 0 が出力されます。何か単純なものが欠けているに違いないと思いますが、6 時間試してみると、それを見るには新しい目が必要だと思います。