2009-08-21 7 views
4

Je cette sql:Comment faire la mise à jour de la table CE Sql Server à partir d'une autre table

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) 

Il fonctionne jusqu'à ce que je retourne dans 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é (que je penser travaillerait 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 ] 

Alors, je peux écrire sql dynamique au lieu d'utiliser Paramé ters, ou je peux passer 2 paramètres avec la même valeur, mais est-ce que quelqu'un sait comment faire cela d'une meilleure façon?

Colin

+0

Réponse mise à jour pour couvrir la deuxième partie de votre question. –

Répondre

5

Votre deuxième tentative ne fonctionne pas parce que, sur la base Books On-Line entry for UPDATE, SQL CE does't permet une clause FROM dans une déclaration 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 pouvez créer un alias JOBMAKE comme JM pour faire la requête un peu plus courte.

EDIT

Je ne suis pas sûr à 100% des limites de SQL CE en ce qui concerne la question soulevée dans les commentaires (comment mettre à jour une valeur JOBMAKE en utilisant une valeur de JOBVISIT). Tenter de faire référence 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 est non testé mais peut fonctionner, car il ressemble à SQL CE prend en charge 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 toutefois une limitation. 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 curseur.

+1

Cela fonctionne certainement pour mon scénario particulier. Je vous remercie. Toutefois, si j'avais voulu mettre à jour une valeur à partir de la table JobVisit, comment le ferais-je? J'ai essayé (comme un test) MISE À JOUR JOBMAKE SET WIP_STATUS = JV.RES_CODE OÙ EXISTE (SELECT 1 DE JOBVISIT AS JV OU JV.JBT_TYPE = JOBMAKE.JBT_TYPE ET JV.JOB_NUMBER = JOBMAKE. JOB_NUMBER AND JV.JVST_ID = 20) Le nom de la colonne n'est pas valide. [Nom de noeud (le cas échéant) = JV, Nom de colonne = RES_CODE] – Colin

+1

Je reçois cette erreur lorsque j'essaie cette syntaxe: "Une erreur est survenue lors de l'analyse de la requête. [Numéro de ligne de jeton = 2, Décalage de ligne de jeton = 2, Jeton dans error = SELECT] " Je crois que Sql CE ne supporte pas les sous-requêtes qui retournent des valeurs scalaires. – Colin

+0

Dans ce cas, je ne crois pas que vous pouvez le faire en une seule requête. Vous devez attribuer une valeur à une variable dans une requête, puis utiliser la variable pour effectuer la mise à jour dans la seconde. –

Questions connexes