[英]Using items from List<string> in SQL query
好的,我有一個列表,其中包含一堆來自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;";
並不是我寬恕了這一點,因為您應該使用參數化查詢。 但是,這應該起作用:
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());
未經測試,但是您應該知道:
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中附加字符串,這被認為是潛在的安全風險。
您可以通過這種方式查找SQL的IN語言,以獲取SQL Server在數據庫中可以找到的部分的答案。 對所有項目使用WHERE x = y意味着如果找不到一項,則整個查詢將不返回任何內容。
我會考慮在存儲過程中執行此操作,並將您的列表作為Xml
參數傳遞。
有關在存儲過程中使用Xml參數的更多信息,請參見以下文章:
使用XML參數將列表傳遞給SQL Server 2005-Jon Galloway
從那里開始,您可以使用Xml語法輕松地在存儲的proc中使用列表數據,並將其幾乎視為另一個數據表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.