2013-02-22 24 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主机名)”