2009-05-07 7 views
0

하나 이상의 SQL Server 2000 데이터베이스에서 하나의 정렬 된 스트림으로 들어오는 두 개의 정렬 된 스트림 스트림을 C#에서 일부 메모리 병합해야합니다. 이러한 데이터 스트림은 거대 할 수 있으므로 두 스트림을 메모리로 가져 오지는 않습니다. 대신 메모리의 각 스트림에서 한 번에 하나의 항목을 유지하고 각 단계에서 각 스트림의 현재 항목을 비교하고 최소 스트림을 최종 스트림으로 밀어 넣은 다음 적절한 소스 스트림에서 다음 항목을 가져와야합니다. 그러나 올바르게 수행하려면 메모리 내 비교가 데이터베이스의 데이터 정렬과 일치해야합니다 (스트림 [A,B,C][A,B,C]을 고려하십시오. 올바른 병합 시퀀스는 [A,A,B,B,C,C]이지만 인 메모리 비교는 C < B으로 생각하면 메모리 내 병합 그것은 BC보고됩니다 점하는 A,A,B을 얻을 것이며, 잘못 분류 스트림의 결과로, C를 얻을 것입니다)SQL Server 2000의 VARCHAR 데이터 정렬 대 VARBINARY 정렬 순서

그래서, 내 질문은 것은 :. 중 하나를 모방 할 수있는 방법이있다 SQL Server 2000에서 System.StringComparison enum을 C#으로 사용하거나 그 반대의 경우에도 데이터 정렬은 어떻게됩니까? 가장 가까운 것은 System.StringCompaison.Ordinal을 사용하여 VARBINARY 표준으로 변환 된 VARBINARY으로 변환 된 데이터베이스 문자열의 결과를 사용하는 것입니다. 다만, "order by name collate X" 절을 추가 할 것입니다. 여기서 X는 몇 가지 데이터 정렬입니다. VARBINARY과 똑같은 방식으로 작동합니다. 데이터베이스에서 나가고 메모리에 들어올 때 문자열로 돌아갈 때 모든 문자열을 VARBINARY으로 변환하는 것이 아닙니다.

답변

0

StringComparer 클래스를 살펴보십시오. 이렇게하면 String.Compare보다 더 강력한 문자 및 문자열 비교가 제공됩니다. 정적 인스턴스 (CurrentCulture, InvariantCulture, Ordinal)의 세 세트와 각각의 대소 문자를 구분하는 버전이 있습니다. 더 전문화 된 문화권의 경우 StringComparer.Create() 함수를 사용하여 특정 문화권에 연결된 비교자를 만들 수 있습니다.

0

SQL을 사용하면 db 엔진이 정렬을 수행하기 위해 OS 호출을하지 않는다는 것을 알고 있습니다. 주문 규칙은 db (서비스 팩으로 업데이트 할 수 있지만 OS에서는 변경되지 않음)와 함께 정적으로 제공됩니다. 따라서 바이너리 데이터 정렬을 사용하지 않는 한 db 코드와 동일한 코드를 사용하지 않는 한 주어진 애플리케이션 코드 세트가 같은 방식으로 정렬 될 수 있다고는 생각지 않는다.

그러나 db 및 클라이언트 코드에서 이진 데이터 정렬을 사용하면 전혀 문제가 없습니다.

EDIT - _BIN으로 끝나는 모든 데이터 정렬은 바이너리 정렬을 제공합니다. 데이터 정렬 이름의 나머지 부분은 CHAR 데이터를 저장하는 데 사용되는 코드 페이지를 결정하지만 순서에 영향을 미치지 않습니다. _BIN은 엄격하게 2 진 정렬을의 L합니다. http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

+0

을 참조하십시오. _BIN이 SQL Server 2000에 적용됩니까? –

+0

Latin1_General_BIN과 Latin1_General_BIN2를 포함하여 여러 가지 BIN 순서를 시도했지만 StringComparison.Ordinal과 다릅니다. 내 테스트 케이스에는 특정 길이까지 모든 바이트 문자열 생성, System.Text.Encoding.Unicode.GetString을 사용하여 문자열로 변환, StringComparison.Ordinal을 사용하여 정렬, 결과를 "order"를 사용하여 데이터베이스와 비교하는 작업이 포함됩니다 콜레트 X ". _BIN 또는 _BIN2 순서 중 메모리 정렬 순서가 아직 일치하지 않습니다. –

+0

@larry - db에서 문자열을 어떻게 생성하고 있습니까? 그냥 캐스팅 (0x .....로 nvarchar (N))? – ahains