В TSQL я могу написать:C# синтаксис TSQL "IN" параметр
Select * from mytablename M where M.field in (1, 5, 8, 56)
Если я хочу сделать то же самое в параметризированных C#, что синтаксис?
В TSQL я могу написать:C# синтаксис TSQL "IN" параметр
Select * from mytablename M where M.field in (1, 5, 8, 56)
Если я хочу сделать то же самое в параметризированных C#, что синтаксис?
SQL Server 2008 имеет функцию Table-Valued Parameters. Вы создаете «специальный тип» в SQL Server, а затем можете передать DataTable
в качестве параметра, содержащего все нужные значения.
Вы можете использовать его таким образом:
На БД это сделать: 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
и Table-Valued Parameter и выполнить поиск по нескольким условиям одновременно.
(обратите внимание, что мой код долог, потому что это рабочий пример на основе AdventureWorks Д.Б. от Microsoft)
ли вы имеете в виду 'IN (@ p1, p2 @, @ p3, p4 @)'? –
Просто мой мозг переполнен .. –
Это помогает, когда нисходящие потоки сопровождаются комментарием того, чего не хватает. – hatchet