如何从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 + ")";
为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种方法可以实现您想要的。你可以选择最适合你的。
- 在代码中使用IN
- 分解为OR。(1,2,3(中的A=>A=1或A=2或A=3
- 使用表值参数
- 用户先前传递的sql查询。例如:"SELECT*FROM表WHERE hostname IN(从前面使用的表中选择主机名(">