Есть ли более эффективный способ справиться с этими вызовами замены - PullRequest
0 голосов
/ 04 января 2010

Я запрашиваю через две базы данных, разделенные устаревшим приложением. Когда приложение встречает такие символы, как «ü», «’ »,« ó », они заменяются на«? ».
Поэтому для сопоставления сообщений я использовал несколько вызовов «замены», например:

(replace(replace(replace(replace(replace(replace(lower(substring([Content],1,153)) , '’', '?'),'ü','?'),'ó','?'), 'é','?'),'á','?'), 'ñ','?'))

Более двух тысяч записей, это может (как вы ожидаете) очень медленно. Вероятно, есть лучший способ сделать это. Спасибо, что сказали мне, что это такое.

Ответы [ 4 ]

1 голос
/ 04 января 2010

Одна вещь, которую вы можете сделать, это реализовать функцию RegEx Replace в виде сборки SQL, и вызов в качестве пользовательской функции в вашем столбце вместо вызовов Replace (). Может быть быстрее. Вы также хотите, вероятно, к тому же RegEx Replace на переданных вами значениях запроса. Регулярное выражение TSQL

0 голосов
/ 05 января 2010

Вы можете создать постоянный вычисляемый столбец в той же таблице, где находится столбец [Content]. В качестве альтернативы вы, вероятно, можете ускорить замену, создав пользовательскую функцию в C #, используя StringBuilder. И вы даже можете объединить оба этих решения.

[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString LegacyReplace(SqlString value)
{
    if(value.IsNull) return value;
    string s = value.Value;
    int l = Math.Min(s.Length, 153);
    var sb = new StringBuilder(s, 0, l, l);
    sb.Replace('’', '?');
    sb.Replace('ü', '?');
    // etc...
    return new SqlString(sb.ToString());
}
0 голосов
/ 04 января 2010

Не могли бы вы преобразовать строки в varbinary перед сравнением? Примерно так:

declare 
   @Test varbinary (100)
   ,@Test2 varbinary (100)
select 
   @Test = convert(varbinary(100),'abcu')
   ,@Test2 = convert(varbinary(100),'abcü')

select 
   case
      when @Test <> @Test2 then 'NO MATCH'
      else 'MATCH'
   end
0 голосов
/ 04 января 2010

Почему бы сначала не сделать такую ​​же замену (chars to "?") Для строки, которую вы ищете на стороне приложения, используя регулярные выражения? Например. ваш запрос к SQL-серверу, которому была передана необработанная строка для поиска и использовала эти вложенные вызовы replace (), вместо этого будет передана поисковой строке, уже содержащей символы «?» в коде приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...