好的,我有一个由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;";
答案 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语法轻松地在存储过程中使用列表数据,并将其视为另一个数据表。