如何从SQL查询与数组成员的比较

本文关键字:数组 组成员 比较 查询 SQL | 更新日期: 2023-09-27 18:00:51

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

包含:compname1, compname2, compname3

实际上,它从另一个SQL查询中获取它的成员。

我有一个数据表,我需要查询数组中hostname列包含任何计算机名的所有行。

类似于:

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 + ")";

如何从SQL查询与数组成员的比较

为IN子句使用参数的最佳方式是使用表值参数,在您的情况下,您需要一个类型作为具有一个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
}

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

  1. 在代码中使用IN
  2. 分解为OR。(1,2,3(中的A=>A=1或A=2或A=3
  3. 使用表值参数
  4. 用户先前传递的sql查询。例如:"SELECT*FROM表WHERE hostname IN(从前面使用的表中选择主机名(">