2009-08-21 3 views
4

나는이 SQL이 : 나는 매개 변수화 쿼리으로 바꿀 때까지다른 테이블의 SQL 서버 CE 테이블 갱신을 수행하는 방법에

UPDATE JOBMAKE SET WIP_STATUS='10sched1' 
WHERE JBT_TYPE IN (SELECT JBT_TYPE FROM JOBVISIT WHERE JVST_ID = 21) 
AND JOB_NUMBER IN (SELECT JOB_NUMBER FROM JOBVISIT WHERE JVST_ID = 21) 

의미가 있습니다 :

UPDATE JOBMAKE SET WIP_STATUS='10sched1' 
WHERE JBT_TYPE IN (SELECT JBT_TYPE FROM JOBVISIT WHERE JVST_ID = @jvst_id) 
AND JOB_NUMBER IN (SELECT JOB_NUMBER FROM JOBVISIT WHERE JVST_ID = @jvst_id) 

Duplicated parameter names are not allowed. [ Parameter name = @jvst_id ] 

나는이 시도를 (내가하는 SQL Server 2005에서 작동 것이라고 생각 - 나는 그것을 시도하지 않은 있지만) : 그래서

UPDATE JOBMAKE 
SET WIP_STATUS='10sched1' 
FROM JOBMAKE JM,JOBVISIT JV 
WHERE JM.JOB_NUMBER = JV.JOB_NUMBER 
AND JM.JBT_TYPE = JV.JBT_TYPE 
AND JV.JVST_ID = 21 
There was an error parsing the query. [ Token line number = 3,Token line offset = 1,Token in error = FROM ] 

, 내가 대신 parame를 사용하는 동적 SQL을 작성할 수 있습니다 ters를 사용하거나 동일한 값을 가진 2 개의 매개 변수를 전달할 수 있지만이 방법을 더 잘 수행하는 방법을 알고 있습니까?

콜린

+0

질문의 두 번째 부분에 대한 답변이 업데이트되었습니다. –

답변

5

Books On-Line entry for UPDATE에 따라, SQL CE가 업데이트 문에서 FROM 절을 허용 does't 때문에 두 번째 시도가 작동하지 않습니다.

나는 그것을 테스트하기 위해 SQL 콤팩트 에디션이없는,하지만이 작동 할 수 있습니다 :

UPDATE JOBMAKE 
SET WIP_STATUS = '10sched1' 
WHERE EXISTS (SELECT 1 
       FROM JOBVISIT AS JV 
       WHERE JV.JBT_TYPE = JOBMAKE.JBT_TYPE 
       AND JV.JOB_NUMBER = JOBMAKE.JOB_NUMBER 
       AND JV.JVST_ID = @jvst_id 
      ) 

그것은 당신이 쿼리가 약간 짧게하는 JM으로 JOBMAKE 별칭을 수있을 수 있습니다.

편집

나는 그들이 코멘트 (방법 JOBVISIT에서 값을 사용하여 JOBMAKE의 값을 업데이트하는)에서 제기 된 문제와 관련된 SQL CE의 한계 확실히 100 % 아니에요. 외부 쿼리에서 EXISTS 절의 내용을 참조하려는 시도는 내가 만났던 SQL 언어에서 지원되지 않지만 시도 할 수있는 다른 방법이 있습니다. 이것은 테스트되지 않았지만 작동 할 수 있습니다. SQL CE는 상관 된 하위 쿼리를 지원합니다.

UPDATE JOBMAKE 
SET WIP_STATUS = (SELECT JV.RES_CODE 
        FROM JOBVISIT AS JV 
        WHERE JV.JBT_TYPE = JOBMAKE.JBT_TYPE 
        AND JV.JOB_NUMBER = JOBMAKE.JOB_NUMBER 
        AND JV.JVST_ID = 20 
       ) 

그러나 제한 사항이 있습니다. JOBVISIT에서 둘 이상의 행이 JOBMAKE의 각 행에 대해 다시 실행되는 경우이 쿼리는 실패합니다. 이것이 작동하지 않는 경우 (또는 내부 쿼리를 외부 행당 단일 행으로 직접 제한 할 수없는 경우) 커서를 사용하여 행 단위 업데이트를 수행 할 수 있습니다.

+1

그건 분명히 내 특정 시나리오에 적용됩니다. 고맙습니다. 그러나 JobVisit 테이블에서 값을 업데이트하려면 어떻게해야합니까? 제가 존재 업데이트 JOBMAKE SET WIP_STATUS = JV.RES_CODE 는 (JV JV.JBT_TYPE = JOBMAKE.JBT_TYPE AND JV.JOB_NUMBER JOBMAKE = AS JOBVISIT FROM 1을 선택 (단지 테스트로) 시도. JOB_NUMBER AND JV.JVST_ID = 20) 열 이름이 유효하지 않습니다. [노드 이름 (있는 경우) = JV, 열 이름 = RES_CODE] – Colin

+1

해당 구문을 시도 할 때이 오류가 발생합니다. "쿼리를 구문 분석하는 동안 오류가 발생했습니다. [토큰 행 번호 = 2, 토큰 행 오프셋 = 2, 토큰 입력 오류 = SELECT] " 나는 SQL CE 스칼라 값을 반환하는 하위 쿼리를 지원하지 않습니다 믿습니다. – Colin

+0

어떤 경우에, 나는 당신이 단일 쿼리에서 이것을 할 수 있다고 생각하지 않습니다. 하나의 쿼리에서 변수에 값을 할당 한 다음 변수를 사용하여 두 번째로 업데이트를 수행해야합니다. –