2013-01-23 3 views
0

다음 형식의 테이블에 필드가 있습니다. 1_2..1_10|1_6|1_8|1_2..1_101_2, 1_3 및 기타가 포함되어 있습니다.Navision 필터를 SQL로 변환

어떻게 데이터를 선택할 수 있습니까? number = 1_3?

+0

당신은 DB 구조를 변경할 수 없습니다? 이것은 특히 끔찍한 것입니다 ... –

+0

불행히도 아니요 –

+0

Run Away !!!!!!! –

답변

1

첫 번째 제안 : db 구조를 수정하고 Navision 문자열을 더 잘 저장하는 방법을 알아 봅니다.

2 차 제안 : CLR은

나는 당신이 이러한 개념의 각각 상대적으로 편안 가정합니다. 당신이 그렇지 않다면 그들은 웹상에서 잘 문서화되어 있습니다.

내 접근 방식은 CLR 함수를 사용하는 것이므로 C#이 아주 쉽게 처리 할 수있는 SQL의 일부 고수준 작업이 될 것입니다. 가짜 도보는 이와 같이 갈 것입니다.

구현

  1. 은 CLR의 funciton를 작성하고 SQL 서버 인스턴스를 구현합니다.
  2. SQL 결과 집합을 사용하면 쿼리가 "1_3"인 탐색 필터 값을 기반으로 CLR 함수의 반환 값을 찾습니다.

CLR 기능 로직

  1. 필터 필드의 값을 취하고 문자열 값을 반환하는 C# 1 함수를 만든다.
  2. CLR 함수는 필터 필드를 | char를 목록에 추가합니다.
  3. CLR 함수 안에서 두 번째 목록을 만듭니다. 첫 번째 목록을 반복합니다. 원거리 문자열을 찾을 때 ".."에서 분할하고 수동으로 두 번째 목록 범위 사이의 모든 사용 가능한 값을 추가하십시오. 원거리가 아닌 값을 찾으면 두 번째 목록에 값을 추가하십시오.
  4. 두 번째 목록의 내용을 함께 "|" charecter.
  5. 조인 된 값을 반환합니다.

SQL 로직

SELECT Field1,Field2...CLRFunctionName(FilterValue) AS FixedFilterValue FROM Sometable WHERE FixedFilterValue LIKE '%1_3%'; 
+0

SQL 서버 내부에서 함수를 사용하는 방법을 고려했지만, 행 당 함수 호출 내에서 임시 테이블의 양이 커질수록 성능이 크게 향상 될 것으로 생각됩니다. C# 및 .NET은 SQL Server보다이 반복 유형 사고 프로세스를 더 빨리 처리해야합니다. 또한 CLR은 제대로 구현하기 어려울 수 있으며 일단 구현되면 유지 보수하기가 어려울 수 있다는 점에 유의하십시오. –

+0

그리고 또 하나의 메모. 데이터베이스가 클 경우, 서둘러 어떤 식 으로든이 쿼리를 다시 가져 오는 것을 잊어 버리십시오. 그것은 아주 느리게 진행될 것입니다. 내가 말했듯이 최선의 방법은 탐색 필터가 SQL을 쉽게 씹을 수있는 방법을 찾을 수있는 방법을 찾는 것입니다. –