Comment faire de Sql Server CE tableau de mise à jour à partir d'une autre table
J'ai cette 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)
Il fonctionne jusqu'à ce que je le transformer en un paramétrer la requête:
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, serait de travailler dans SQL SERVER 2005 - bien que je n'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 du sql dynamique au lieu d'utiliser les paramètres, ou je peux la passer en 2 paramètres avec la même valeur, mais quelqu'un sait comment faire une meilleure façon?
Colin
Mise à jour de la réponse à la deuxième partie de votre question.
OriginalL'auteur Colin | 2009-08-21
Vous devez vous connecter pour publier un commentaire.
Votre deuxième tentative ne fonctionne pas car, sur la base de la Livres Sur la Ligne d'entrée pour la mise à JOUR, SQL CE n'est pas de permettre à un
FROM
clause dans une instruction de mise à jour.Je n'ai pas de SQL Compact Edition pour le tester sur, mais cela peut fonctionner:
Peut-être que vous pouvez alias JOBMAKE comme JM pour rendre la requête légèrement plus courte.
MODIFIER
Je ne suis pas sûr à 100% de l'limitations de SQL CE qu'ils se rapportent à la question posée dans les commentaires (comment mettre à jour une valeur dans JOBMAKE à l'aide d'une valeur de JOBVISIT). Tentant de se référer au contenu de la clause EXISTS dans la requête externe est pris en charge dans aucun dialecte SQL je suis venu à travers, mais il existe une autre méthode, vous pouvez essayer. Ce n'est pas testée, mais peuvent fonctionner, car il ressemble SQL CE prend en charge les sous-requêtes corrélées:
Il y a toutefois une limitation. Cette requête échoue si plus d'une ligne dans JOBVISIT est accordé pour chaque ligne de JOBMAKE.
Si cela ne fonctionne pas (ou vous ne pouvez pas franchement à la limite de la requête interne à une seule rangée par rangée externe), il serait possible de réaliser une ligne par ligne de mise à jour à l'aide d'un curseur.
J'ai cette erreur quand j'essaie de syntaxe: "Il y a eu une erreur lors de l'analyse de la requête. [ Jeton numéro de ligne = 2,Jeton de décalage de ligne = 2,Jeton dans l'erreur = SELECT ]" je crois que Sql CE ne prend pas en charge les sous-requêtes qui retournent des valeurs scalaires.
Dans ce cas, je ne crois pas que vous pouvez le faire en une seule requête. Vous devez affecter une valeur à une variable dans une requête, puis utiliser la variable pour faire la mise à jour dans la seconde.
Merci Ed. Vous avez répondu à ma question.
OriginalL'auteur Ed Harper