2010-01-04 4 views
0

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

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

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

ответ

0

Вы можете создать сохраненный вычисляемый столбец одной таблицы, где [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

Я думаю, что этот ответ довольно крут, и я использовал некоторые его элементы в своем решении. благодаря – Irwin

0

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

+0

Это не отвечает на его вопрос. Во всяком случае, вам нужно выполнить ту же замену с обеих сторон, столбец сервера и передать строку. – Codewerks

+0

@Codewerks - мое понимание OP заключается в том, что в столбце сервера уже есть «замещенные» значения. – DVK

1

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

+0

Мне нравится идея сделать столбец в первую очередь, я имею в виду, я мог бы даже сохранить миллион замещений, но сделать это один раз, сохранить это в таблице temp, а затем сравнить с другой таблицей баз данных через temp. он должен значительно сократить количество сравнений. – Irwin

0

Не удалось ли преобразовать строки в 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

Как это поможет в сравнении с персонажем? – Irwin

Смежные вопросы