Применение функции к столбцу обычно приводит к тому, что запрос становится «не SARGable», это означает, что индексы больше не могут использоваться (есть несколько исключений). Основная причина, по которой это происходит, заключается в том, что порядок данных уже не тот, что связано с использованием функции (обратите внимание, то, что функция не меняет порядок, не означает, что она будет SARGable). Поскольку порядок новых данных может не соответствовать порядку индекса, он не может быть использован
очевидная причина, по которой вы используете UPPER
, заключается в том, что вы используете сортировку с учетом регистра , Теперь для некоторых сопоставлений порядок букв сортируется как A,a,B,b,C,c...Y,y,Z,z
, а для других это A,B,C...Y,Z,a,b,c...,y,x
, это означает, что в зависимости от сопоставления a
может быть как больше, так и меньше B
. Применение UPPER
к этому значению будет означать, что значение всегда меньше чем B
; таким образом, меняя порядок.
Таким образом, для баз данных сортировки с учетом регистра, наиболее распространенным методом является сохранение вычисляемого столбца PERSISTED
со значением верхнего регистра:
ALTER TABLE dbo.YourTable ADD Name_UC AS UPPER([Name]) PERSISTED;
Затем, когда вы передавая значения (параметры), вы также убедитесь, что все они в верхнем регистре:
SELECT {columns}
FROM dbo.YourTable
WHERE Name_UC = UPPER(@YourParameter);
Конечно, для того, что у вас есть (WHERE UPPER(Name) = 'Banana'
) , если вы являетесь с использованием сортировки с учетом регистра, он никогда не вернет никаких результатов, поскольку 'anana'
являются строчными буквами.