Как выполнить обновление таблицы Sql Server CE из другой таблицы - PullRequest
4 голосов
/ 21 августа 2009

У меня есть этот sql:

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 ]

Итак, я могу написать динамический sql вместо использования параметров, или я могу передать 2 параметра с одинаковым значением, но кто-то знает, как это сделать лучше?

Colin

1 Ответ

5 голосов
/ 21 августа 2009

Ваша вторая попытка не работает, потому что, основываясь на записи Книги в Интернете для UPDATE , SQL CE не допускает предложение FROM в операторе обновления.

У меня нет SQL Compact Edition для тестирования, но это может сработать:

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
             )

Возможно, вы можете использовать псевдоним JOBMAKE как JM, чтобы сделать запрос немного короче.

EDIT

Я не уверен на 100% в ограничениях SQL CE, поскольку они связаны с вопросом, поднятым в комментариях (как обновить значение в JOBMAKE, используя значение из JOBVISIT). Попытка сослаться на содержимое предложения 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. Если это не работает (или вы не можете просто ограничить внутренний запрос одной строкой на внешнюю строку), можно будет выполнить построчное обновление с помощью курсора.

...