在SQL查询</string>中使用List <string>中的项目

时间:2010-07-13 15:30:29

标签: c# sql

好的,我有一个由sql查询中的一堆值组成的列表,该部分工作正常。我想要做的是使用该列表中的项目来告诉另一个查询要查找的内容。所以,它说的是,它应该返回CMMReports中的所有列,其中PartNumber就像%listItem1..2 ... 3%,任何建议?

List<string> ImportedParts = GetImportedPartNumbers();

string query = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND PartNumber LIKE %" + ImportedParts + "% ORDER BY CreatedOn DESC;";

4 个答案:

答案 0 :(得分:1)

并不是因为你应该使用参数化查询而宽恕这一点。但是,这应该有效:

StringBuilder partNumbers = new StringBuilder();
foreach (string queryValue in ImportedParts)
{
    string q = "PartNumber LIKE '%" + queryValue + "%'";
    if (string.IsNullOrEmpty(partNumbers.ToString())
    {
       partNumbers.Append(q);
    }
    else
    {
       partNumbers.Append(" OR " + q);
    }
}

string query = string.Format("SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') " +
           "AND (FilePath NOT LIKE '%js91162%') AND ({0}) " +
           "ORDER BY CreatedOn DESC;", partNumbers.ToString());

答案 1 :(得分:0)

未经测试,但您应该明白这一点:

List<string> ImportedParts = GetImportedPartNumbers(); 

SqlCommand cmd = myConnection.CreateCommand();
cmd.CommandText = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND (";

int i = 0;
foreach (string part in ImportedParts) {
    cmd.AddParameterWithValue("@param" + i.ToString(), "%" + part + "%");
    if (i != 0) cmd.CommandText += " OR"
    cmd.CommandText += " PartNumber LIKE @param" + i.ToString();
    i++;
}

cmd.CommandText += ") ORDER BY CreatedOn DESC;";

此解决方案使用参数化查询,而不是仅在SQL中附加字符串,这被视为潜在的安全风险。

答案 2 :(得分:0)

您可以查找SQL的IN clouse,以获得SQL Server可以在数据库中找到的部分的答案。对所有项使用WHERE x = y意味着如果找不到一个项,则整个查询不返回任何内容。

答案 3 :(得分:0)

我会考虑在存储过程中执行此操作,并将您的列表作为Xml参数传递。

有关在存储过程中使用Xml参数的更多信息,请参阅以下文章:

Passing lists to SQL Server 2005 with XML Parameters - By Jon Galloway

在那里,您可以使用Xml语法轻松地在存储过程中使用列表数据,并将其视为另一个数据表。