2013-08-16 4 views
0

В TSQL я могу написать:C# синтаксис TSQL "IN" параметр

Select * from mytablename M where M.field in (1, 5, 8, 56) 

Если я хочу сделать то же самое в параметризированных C#, что синтаксис?

+1

ли вы имеете в виду 'IN (@ p1, p2 @, @ p3, p4 @)'? –

+0

Просто мой мозг переполнен .. –

+0

Это помогает, когда нисходящие потоки сопровождаются комментарием того, чего не хватает. – hatchet

ответ

1

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)

Смежные вопросы