2013-08-16 56 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

它有助於當downvotes伴隨着什麼是缺乏評論。 – hatchet

回答

1

SQL Server 2008有一個名爲Table-Valued Parameters的特性。你在SQL Server中創建一個「特殊類型」,然後你可以傳遞一個DataTable作爲參數,包含你想要的所有值。

你可以用這種方式:

在DB這樣做:CREATE TYPE dbo.IntArray AS TABLE (Value INT NOT NULL)

您的查詢必須改變,以這樣的: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參數,並同時在多個條件下執行搜索。

(注意,是因爲它是基於微軟的AdventureWorks的DB工作的例子我的代碼過長)