2010-01-04 7 views
0

레거시 응용 프로그램으로 구분 된 두 개의 DB를 통해 쿼리하고 있습니다. 앱에서 'ü', '' ','ó '와 같은 문자를 만날 때'? '로 바뀝니다.
그래서 일치하는 메시지, 나는 '대체'의 무리를 사용하고하는 것은과 같이 호출이러한 대체 호출을 처리하는보다 효율적인 방법이 있습니까

몇 천 개 기록 이상
(replace(replace(replace(replace(replace(replace(lower(substring([Content],1,153)) , '’', '?'),'ü','?'),'ó','?'), 'é','?'),'á','?'), 'ñ','?')) 

,이 수 (예상대로) 매우 느립니다. 이렇게하는 것이 더 좋은 방법 일 것입니다. 그것이 무엇인지 말해줘서 고마워.

답변

0

당신은 [Content] 열은 같은 테이블에 지속 형 계산 열을 만들 수 있습니다. 또는 StringBuilder을 사용하여 C#에서 사용자 정의 함수를 만들어 교체 속도를 높일 수도 있습니다. 또한 이러한 두 가지 솔루션을 결합 할 수도 있습니다.

[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

어째서 정규 표현식을 사용하여 앱 측에서 검색하는 문자열에서 처음에 동일한 대체 문자 ("?")를 사용하지 않으시겠습니까? 예 : 이 중첩 된 replace() 호출을 검색하고 사용하는 원시 문자열이 전달 된 SQL 서버 쿼리에 대신 응용 프로그램 코드에서 "?"가 포함 된 검색 문자열이 전달됩니다.

+0

실제로 질문에 대한 답변이 없습니다. 무엇이든간에, 당신은 양쪽에서 동일한 교체를해야하며, 서버 열은 문자열로 전달됩니다. – Codewerks

+0

@Codewerks - OP에 대한 나의 이해는 서버 열이 이미 "바뀐"값을 가지고 있다는 것입니다. – DVK

1

RegEx Replace 함수를 SQL 어셈블리로 구현하면 호출이 Replace() 호출 대신 사용자 정의 함수로 사용자 정의 함수로 구현됩니다. 더 빠를 수 있습니다. 또한 전달 된 쿼리 값에서 동일한 RegEx Replace를 사용하려고합니다. TSQL Regular Expression

+0

저는 열을 먼저 써야한다는 생각을 좋아합니다. 백만 단위를 유지할 수도 있지만 임시 테이블에 저장 한 다음 임시 테이블을 통해 다른 데이터베이스 테이블과 비교하면됩니다. 비교 횟수를 크게 줄여야합니다. – 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

관련 문제