Comment faire pour mettre à jour la table Sql Server CE à partir d'une autre table

J'ai ce 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) 

Cela fonctionne jusqu'à ce que je l'ai transformé en une requête paramétrée:

 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 ] 

J'ai essayé ceci (qui je pense fonctionnerait dans SQL SERVER 2005 – bien que je ne l'ai pas essayé):

 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 ] 

Donc, je peux écrire dynamic SQL au lieu d'utiliser des parameters, ou je peux passer en 2 parameters avec la même valeur, mais quelqu'un sait comment faire une meilleure façon?

Colin

Votre deuxième tentative ne fonctionne pas car, en fonction de l' input Books On-Line pour UPDATE , SQL CE n'autorise pas une clause FROM dans une instruction de mise à jour.

Je n'ai pas SQL Compact Edition pour le tester, mais cela pourrait fonctionner:

 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 ) 

Il se peut que vous puissiez alias JOBMAKE comme JM pour rendre la requête légèrement plus courte.

MODIFIER

Je ne suis pas sûr à 100% des limitations de SQL CE car elles se rapportent à la question soulevée dans les commentaires (comment mettre à jour une valeur dans JOBMAKE en utilisant une valeur de JOBVISIT). Tenter de faire reference au contenu de la clause EXISTS dans la requête externe n'est pas pris en charge dans tout dialecte SQL que j'ai rencontré, mais il existe une autre méthode que vous pouvez essayer. Ceci n'est pas testé mais peut fonctionner, car il semble que SQL CE supporte les sous-requêtes corrélées:

 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 ) 

Il y a une limitation, cependant. Cette requête échouera si plus d'une ligne dans JOBVISIT est renvoyée pour chaque ligne dans JOBMAKE. Si cela ne fonctionne pas (ou si vous ne pouvez pas limiter directement la requête interne à une seule ligne par ligne externe), il est possible d'effectuer une mise à jour rangée par ligne à l'aide d'un slider.