2009-08-21 14 views
4

Ich habe diese sql:Wie aktualisierte SQL Server CE-Tabelle aus einer anderen Tabelle

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) 

Es funktioniert, bis ich es in eine parametrisierte Abfrage drehen:

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 ] 

ich schon versucht, diese (was ich denken würde 2005 in SQL Server arbeiten - obwohl ich es nicht versucht haben):

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 ] 

Also, ich dynamische SQL statt parame der Verwendung schreiben oder ich kann 2 Parameter mit dem gleichen Wert übergeben, aber weiß jemand, wie man das besser macht?

Colin

+0

Aktualisierte Antwort, um den zweiten Teil Ihrer Frage zu decken. –

Antwort

5

Ihr zweiter Versuch nicht funktioniert, weil auf der Grundlage der Books On-Line entry for UPDATE, SQL CE eine FROM Klausel in einer Update-Anweisung does't ermöglichen.

Ich habe SQL Compact Edition nicht, es zu testen, aber dies könnte funktionieren:

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 
      ) 

Es kann sein, dass Sie JOBMAKE als JM Aliasnamen für die Abfrage etwas kürzer zu machen.

EDIT

Ich bin nicht 100% sicher, dass die Einschränkungen von SQL CE, wie sie auf die Frage in den Kommentaren angehoben beziehen (wie ein Wert in JOBMAKE zu aktualisieren, um einen Wert von JOBVISIT verwenden). Der Versuch, auf den Inhalt der EXISTS-Klausel in der äußeren Abfrage zu verweisen, wird in keinem SQL-Dialekt unterstützt, auf den ich gestoßen bin. Es gibt jedoch eine andere Methode, die Sie ausprobieren können. Dies ist nicht getestet, kann aber funktionieren, da es wie SQL CE sucht unterstützt korrelierte Unterabfragen:

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 
       ) 

Es gibt eine Einschränkung ist allerdings. Diese Abfrage schlägt fehl, wenn mehr als eine Zeile in JOBVISIT für jede Zeile in JOBMAKE neu abgestimmt wird. Wenn dies nicht funktioniert (oder Sie können die innere Abfrage nicht einfach auf eine einzelne Zeile pro äußere Zeile beschränken), wäre es möglich, eine Zeile für Zeile mit einem Cursor zu aktualisieren.

+1

Das funktioniert sicherlich für mein spezielles Szenario. Vielen Dank. Wenn ich jedoch auf einen Wert aus der JobVisit-Tabelle aktualisieren wollte, wie würde ich das tun? Ich habe versucht (nur als Test) UPDATE JOBMAKE SET WIP_STATUS = JV.RES_CODE WHERE EXISTS (SELECT 1 VON JOBVISIT AS JV WHERE JV.JBT_TYPE = JOBMAKE.JBT_TYPE UND JV.JOB_NUMBER = JOBMAKE. JOB_NUMBER AND JV.JVST_ID = 20) Der Spaltenname ist nicht gültig. [Knotenname (falls vorhanden) = JV, Spaltenname = RES_CODE] – Colin

+1

Ich erhalte diesen Fehler, wenn ich diese Syntax ausprobiere: "Beim Analysieren der Abfrage ist ein Fehler aufgetreten. [Token-Zeilennummer = 2, Token-Zeilen-Offset = 2, Token ein error = SELECT] " Ich glaube, dass Sql CE keine Sub-Abfragen unterstützt, die skalare Werte zurückgeben. – Colin

+0

In diesem Fall glaube ich nicht, dass Sie dies in einer einzigen Abfrage tun können. Sie müssten einer Variablen in einer Abfrage einen Wert zuweisen und dann die Variable für die Aktualisierung in der zweiten Abfrage verwenden. –

Verwandte Themen