2009-09-09 10 views
1

우리는 최근 타사 제품에서 사용하는 OpenEdge 데이터베이스로 일부 작업을 수행해야했으며 오늘 (많은 머리카락을 당긴 후) 결과적으로 뷰가 결과를 반환하지 않는 이유를 확인했습니다. 이 뷰는 약 100 개의 개별 테이블을 결합한 다음 쿼리됩니다 (이 데이터베이스에 대한 권한이 제한되어 있음). 이 뷰에 의해 반환되는 분야 중 하나는이상한 OpenEdge 쿼리 동작

'John Smith' AS TheName 
우리는 우리가 RTRIM하려고했던이 문자열을 포함 쿼리를 실행하는 데 어려움이 있었다

의 라인을 따라, 하드 코딩 된 문자열 리터럴 (뷰 많이 반환 후행 공백)를 제거한 다음 다른 필드와 연결하십시오. 그러나이 필드에서 RTrim을 사용하면 오류 메시지 나 null 등을 반환하는 대신 단순히 행이 반환되지 않습니다. 우리는 WHERE 절이나 JOIN에서 사용하려고 시도하지 않았습니다. 이것은 SELECT ... FROM VIEWNAME의 일부였습니다. 뷰를 검토 한 결과 뷰가 문자열의 길이를 9 문자 (정의에 길이가 지정되지 않았 음)로 잘못 판단한 것으로 보였으므로 RTrim이 제대로 작동하지 않았습니다. 이제 왜 이것이 오류 메시지 또는 SELECT의 NULL 값이 될지 이해할 수 있지만 행이 단순히 전혀 반환되지 않습니다.? 이것은 좋은 SQL 동작처럼 보이지 않으며 다른 RDBMS에서는 발생하지 않습니다.

기타 정보 : 우리는 ODBC 및 WinSQL을 통해 쿼리하여 기존 ASP.NET 응용 프로그램에 포함되도록했습니다. 비록 우리가보기를 만들 권리가 있지만 우리는 이것을 통해서만 백엔드에 접근 할 수 있습니다.

업데이트 : 이상한 후속 조치로서 WHERE 절없이이 뷰를 쿼리하면 레코드가 반환되지 않습니다. 이것은 같은 원인 일 수 있습니다.

답변

1

진도 데이터베이스 내에서 SQL-WIDTH와 관련이있는 것 같습니다. Progress의 한 가지 문제는 필드의 내용이 SQL-WIDTH를 초과하면 이상한 SQL 동작을 얻게됩니다 (때로는 드라이버가 실패 할 수도 있고 그렇지 않은 경우 결과가 나타나지 않을 수도 있음).

이를 확인하려면 dbtool 명령을 사용하여 초과 될 수있는 SQL-WIDTH를 확인해야합니다.

+0

조금 읽은 후에도이 동작에 이상하지만 아직 그럴듯한 원인이있는 것 같습니다. 슬프게도 나는 그것을 확실하게 테스트 할 방법이 없다. – MartW

+0

너비를 확인하기 위해 진행 명령이나 진행 DBA에 액세스 할 수 없습니까? 진행 데이터베이스는 본질적으로 매우 기괴하며 다른 전통적인 SQL 데이터베이스처럼 작동하지 않습니다. –

0

아주 이상한 행동으로 들립니다. 코드를 작성하고 응용 프로그램에서 다듬기 및/또는 문자열 조작을 수행하고 진행하십시오.

1

빈칸이 없는지 확인하십시오. 트리밍은 공백 만 제거합니다. 공백도 널이 아닙니다. 문자 집합에는 차이가 있지만 편집기에서는 시각적으로 다르지 않습니다. 저는 DBII, Oracle, PostGreSQL이라는 몇 가지 데이터베이스로이 작업을 수행했습니다. 편집기의 문자 세트를 확인하고 테이블을 보거나 아무 것도 볼 수 없거나 큰 직사각형이 보일 수 있습니다.