2013-02-22 81 views
1

所以我有一個包含名爲hostnames[]的計算機名稱的數組。如何查詢SQL與數組成員比較?

包含:compname1, compname2, compname3

實際上它得到它從另一個SQL查詢的成員。

我有一個數據表,我需要查詢主機名列中有我的數組中的任何計算機名稱的所有行。

類似:

select * from table where hostname in hostnames[] 

我應該如何着手實現我的目標是什麼?

編輯: 我想在下面:

string temp = "'" + hostnames[0] + "'"; 
for(int i=1; i<hostnames[].Lenght; i++) 
{ 
temp = temp + ",'" + hostnames[i] + "'"; 
} 
string query = "SELECT * FROM table WHERE hostname IN (" + temp + ")"; 
+2

我們可以看到您嘗試過的代碼嗎? – 2013-02-22 17:41:01

+3

根據您的標籤,我不確定您是否在C#或T-SQL中執行此操作。你能澄清一下嗎? – Melanie 2013-02-22 17:42:08

+3

這裏有一篇適合您的文章:[參數化包含IN子句的查詢](http://www.c-sharpcorner.com/blogs/5819/parameterize-a-query-containing-an-in-clause.aspx) – 2013-02-22 17:41:58

回答

2

使用參數IN子句是使用Table-valued parameters最好的方法,你的情況,你需要一個類型與表一個nvarchar列。我用一個通用名稱,以便類型可以不混亂被重用:

CREATE TYPE dbo.StringList AS TABLE (value NVARCHAR(MAX)); 

然後是簡單地增加你的價值觀到DataTable和傳遞這個作爲參數傳遞給你的選擇命令的情況下:

var dataTable = new DataTable(); 
dataTable.Columns.Add(new DataColumn("Value", typeof(string))); 

for (int i = 0; i < hostnames.Length; i++) 
{ 
    var dr = dataTable.NewRow(); 
    dr[0] = ""; 
    dataTable.Rows.Add(dr); 
} 
using (var connection = new SqlConnection("connectionString")) 
using (var command = new SqlCommand("SELECT * FROM Table WHERE HostName IN (SELECT Value FROM @StringList)", connection)) 
{ 
    SqlParameter stringListParameter = new SqlParameter("@StringList", SqlDbType.Structured); 
    stringListParameter.Value = dataTable; 
    stringListParameter.TypeName = "dbo.StringList"; 
    command.Parameters.Add(stringListParameter); 

    // OPEN CONNECTION EXECUTE COMMAND ETC 

} 
1

有4種方式來實現你想要什麼。你選擇最適合你的東西。

  1. 用在爲你的代碼
  2. 分解到OR。 A(1,2,3)=> A = 1或A = 2或A = 3
  3. 使用表值參數
  4. 用戶sql查詢先前傳遞。例如:「SELECT * FROM表WHERE主機名(選擇從tableusedEarlier主機名)」