2013-05-17 3 views
1

string data type을 포함하는 ProjectNum column이 있습니다. 일반적으로 숫자는 X1234...이지만 할당 된 번호가없는 경우 자동 생성되어야하며 프로젝트에 할당 된 우선 순위에 따라 C or F으로 시작하는지 여부에 따라 달라집니다. 따라서 자동 생성 된 숫자는 C or F으로 시작해야하며 6 자리가오고 자동 증가합니다. 그래서 여기이 날 마지막 자동 증가 수를 잡기 위해 다음 내가 @priorityDefID of 4에 보낼 때 문제는, 1.을 추가하여 코드 번호를 자동 생성 (수 있습니다이 쿼리에 어떤 문제가 있으며 더 효율적으로 만들 수 있습니까?

SELECT MAX(CINT(RIGHT(ProjectNum, 6))) AS LastDigits 
FROM project_master_query 
WHERE ((ProjectNum LIKE (IIF([@priorityDefID] = 4, "C*", "F*")))); 

내 쿼리입니다 ... 데이터베이스에 "C"로 시작하는 항목이없는 경우) "This expression is typed incorrectly, or it is too complex to be evaluated. 오류가 나타납니다. 예를 들어 숫자 식에 너무 많은 복잡한 요소가 포함되어있을 수 있습니다. "

내가 왜 4를 넘기는 지 잘 모르지만, 1, 2 또는 3은 올바르게 작동하고 올바른 값을 반환합니다. 대신 생각해 보았습니다. MAX을 작성하고 C 또는 F로 시작하여 오른쪽 6 자리를 가져온 다음 상단 1을 내림차순으로 잡아서 순서대로 정렬 하시겠습니까?

+2

이렇게 보이는 쿼리를 사용하지 않아도됩니다. 나는 ProjectNum 내부에 이러한 종류의 쿼리/함수가 필요한 로직을 포함시키는 것이 현명하다고 생각하지 않습니다. 프로젝트의 우선 순위가 변경되면 ProjectNum을 변경합니까? ProjectNum에 대해 증가하는 숫자를 사용하고 우선 순위 열을 사용하십시오. – HK1

+0

'project_master_query'는 테이블 대신 쿼리가 될 것 같습니다. 그렇다면'ProjectNum'은 어떻게 쿼리의 소스 테이블에 저장됩니까? @ HK1이 언급했듯이, 한 필드에서 두 개의 사실 (* 우선 순위와 시퀀스 번호)을 결합하는 것이 최고의 디자인이 아니므로이 쿼리는 더욱 어려워집니다. 테이블 디자인을 "하나의 필드, 하나의 사실"로 변경할 수 있는지 고려하십시오. 당신이 그들을 결합해야 볼 때마다, 쿼리 표현을 사용하십시오 :'SELECT priority & sequence_number AS ProjectNum' – HansUp

+0

@ HK1 그건 좋은 지적이지만, 불행히도 나는 규칙을 만들지 않습니다. 그러나 그들이 이러한 것들을 설정하는 방법을 판단하면 그들은 변하지 않을 것입니다. 우선 순위 1, 2 및 3은 F 유형 프로젝트이고 4는 완전히 다른 유형의 프로젝트이고 나는 변할 것이라고 믿지 않습니다. –

답변

1

이 쿼리에는 많은 문제점이 있으며 무엇이 모두 어디서부터 시작해야할지 모르겠다. 그러나 CInt()을 6 자리로 사용하는 위험에 대해 경고 할 수 있습니다. 값이 32,767이므로 CInt("999999")은 오버플로 오류를 발생시킵니다. 최대 긴 정수 값이 2,147,483,647이므로 CLng을 사용하는 것이 좋습니다. 따라서 긴 정수는 가능한 모든 6 자리 값을 수용합니다.

이 문제는 현재 ProjectNum 값과 관련하여 문제가되지는 않지만 나중에 더 많은 ProjectNum 값을 저장하면 나중에 문제를 일으킬 수 있습니다. 에 관한

는 "[오류 메시지] 내가 4을 통과와 함께 제공되지만 1, 2 또는 3 잘 작동하고 올바른 값 반환"을, 당신은 또한 순간에 데이터베이스에 아무도 없다 "말했다 'C'로 시작하는 ". 즉, 쿼리는 해당 상황에서 행을 반환하지 않습니다. 나는 이 null을 사용할 수 없기 때문에 에 문제가 발생할 것이라고 의심합니다. 오류입니다.

"C"으로 시작하는 ProjectNum으로 행을 추가하면 오류가 사라지는 지 확인하십시오.

+0

INT 값이 좋은 지점입니다. 나는 ProjectNum이 "C"로 시작하지만 아직 아무것도 반환하지 않을 것이라고 생각했는지 여부를 확인하지 않았기 때문에 내 데이터 테이블이 행이없는 상태로 되돌아 와서 "C000001"을 생성 할 수있었습니다. 그러나 ProjectNum이 아직 할당되지 않았기 때문에 당신의 대답은 의미가 있습니다. –

+0

사실, 어떤 유형의 숫자로 하위 문자열을 변환하면 어떤 가치가 추가되는지는 알 수 없습니다. –

+0

분명히 그렇지 않지만, 문자열 값에 대해 MAX를 수행 할 수 있다고 생각하지 않았습니다. –

관련 문제