1

所以我有一个包含计算机名称的数组,称为hostnames[].

包含: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 + ")";
4

2 回答 2

2

为 IN 子句使用参数的最佳方法是使用表值参数,在您的情况下,您将需要一个类型作为具有一个 nvarchar 列的表。我使用了通用名称,因此可以重用该类型而不会混淆:

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

然后,只需将您的值添加到 DataTable 并将其作为参数传递给您的 select 命令:

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

}
于 2013-02-25T13:14:34.917 回答
1

有4种方法可以实现您想要的。你选择最适合你的。

  1. 在您的代码中使用 IN
  2. 分解为 OR。A IN (1, 2, 3) => A=1 或 A=2 或 A=3
  3. 使用表值参数
  4. 使用之前通过的 sql 查询。例如:“SELECT * FROM table WHERE hostname IN (Select hostname from tableusedEarlier)”
于 2013-02-22T19:06:10.657 回答