cruizer:by the way can you make use of CLR stuff in this implementation you're doing? though i personally have no experience with integrating SQL Server with .NET...
Yes in fact this query that I am enhancing is already a managed stored procedure, which makes dynamic query generation a whole lot easier. I am not aiming for any efficiency, just additional functionality for the users, so I whipped up the following construction logic
internal class NameQuery
{
private static readonly char[] nameToken = new char[] { ' ' };
private static readonly string AndOperator = "AND ";
internal static void QueryName(StringBuilder queryBuilder, SqlCommand command, string name, bool anyOrder)
{
if (anyOrder)
QueryAnyOrder(queryBuilder, command, name);
else
QuerySingular(queryBuilder, command, name);
}
/// <summary>
/// Constructs name query for only a singular name string.
/// </summary>
internal static void QuerySingular(StringBuilder queryBuilder, SqlCommand command, string name)
{
queryBuilder.AppendFormat(" AND (en.MainName LIKE '%'+ @name +'%' OR ea.Alias LIKE '%'+ @name +'%')", name);
command.Parameters.AddWithValue("@name", name);
}
/// <summary>
/// Constructs name query to consider all parts of the name string, in any order.
/// </summary>
/// <remarks>
/// In order to use conventional T-SQL LIKE operator to support matching all parts of a name,
/// in any order, the full name string has to be broken down into its individual parts
/// and place into its own LIKE comparison on the same column value. This is performance impeding
/// as more name parts are compared against more records.
/// </remarks>
internal static void QueryAnyOrder(StringBuilder queryBuilder, SqlCommand command, string name)
{
StringBuilder mainNameBuilder = new StringBuilder(200);
StringBuilder aliasBuilder = new StringBuilder(200);
string[] nameParts = name.Split(nameToken);
int validCounter = 0;
foreach (string namePart in nameParts)
{
if (namePart.Trim().Length == 0) continue;
if (validCounter > 0)
{
mainNameBuilder.Append(AndOperator);
aliasBuilder.Append(AndOperator);
}
// Each valid namePart is added as its own parameter
// for its part of the query statement.
string parameterName = "@namePart" + validCounter.ToString();
mainNameBuilder.AppendFormat("en.MainName LIKE '%'+ " + parameterName + " +'%' ", namePart);
aliasBuilder.AppendFormat("ea.alias LIKE '%'+ " + parameterName + " +'%' ", namePart);
command.Parameters.AddWithValue(parameterName, namePart);
validCounter++;
}
// If no valid namePart was attached as a parameter and query statement,
// do not attach the AND and OR clauses since there is no condition.
if (validCounter == 0) return;
queryBuilder.AppendLine(" AND (");
queryBuilder.AppendLine(mainNameBuilder.ToString());
queryBuilder.AppendLine(") OR (");
queryBuilder.AppendLine(aliasBuilder.ToString());
queryBuilder.AppendLine(") ");
}
}
The melody of logic will always play out the truth. ~ Narumi Ayumu, Spiral