TSQL では、次のように記述できます。
Select * from mytablename M where M.field in (1, 5, 8, 56)
パラメータ化されたC#で同じことをしたい場合、構文は何ですか?
TSQL では、次のように記述できます。
Select * from mytablename M where M.field in (1, 5, 8, 56)
パラメータ化されたC#で同じことをしたい場合、構文は何ですか?
SQL Server 2008 には、テーブル値パラメーターと呼ばれる機能があります。SQL Server で「特別な型」を作成すると、必要なDataTable
すべての値を含む a をパラメーターとして渡すことができます。
次のように使用できます。
DB で次のようにします。CREATE TYPE dbo.IntArray AS TABLE (Value INT NOT NULL)
IN クエリを次のように変更する必要があります。CustomerID IN (SELECT Value FROM @1)
// Your array of IDs
int[] ids = new[] { 1, 2, 3, 4, 5, 6, 7, 10 };
using (var connection = new SqlConnection("Initial Catalog=AdventureWorksLT2012;Integrated Security=True"))
{
connection.Open();
using (var command = new SqlCommand("SELECT CustomerID FROM SalesLT.Customer WHERE CustomerID IN (SELECT Value FROM @1)", connection))
{
// An untyped Datatable
var dt = new DataTable();
// With a single column
dt.Columns.Add();
// Copy your IDs in the DataTable
foreach (var v in ids)
{
dt.Rows.Add(v);
}
// Create the Table-Valued Parameter
var param = command.Parameters.AddWithValue("@1", dt);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "dbo.IntArray";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = (int)reader[0];
Console.WriteLine(id);
}
}
}
}
技術的には、次のような場合でもクエリを変更できます
INNER JOIN @1 Par ON CustomerID = Par.Value
DataTable
これには、複数列のテーブル値パラメーターを作成し、同時に複数の条件で検索できるという利点があります。
(Microsoft の AdventureWorks db に基づいた実際の例であるため、私のコードは長すぎることに注意してください)