2009-08-21 51 views
4

我有這樣的SQL:如何從另一臺做的SQL Server CE表更新

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個參數,但有人知道如何以更好的方式做到這一點?

科林

+0

已更新的答案涵蓋了問題的第二部分。 – 2009-08-24 20:58:21

回答

5

你的第二次嘗試不起作用,因爲基礎上,Books On-Line entry for UPDATE,SQL CE簡化版,允許在更新語句FROM條款。

我沒有SQL精​​簡版,以測試它,但是這可能工作:

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進行查詢稍短。

編輯

我不是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 
       ) 

有一個限制,但是。如果JOBMAKE中的每行重新運行JOBVISIT中的多行,則此查詢將失敗。 如果這不起作用(或者您無法直接將內部查詢限制爲每個外部行的單個行),則可以使用遊標執行逐行更新。

+1

這當然適用於我特殊的場景。謝謝。 但是,如果我想從JobVisit表中更新一個值,我該怎麼做? 我嘗試(只是作爲測試) UPDATE JOBMAKE SET WIP_STATUS = JV.RES_CODE 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 = 20) 列名稱無效。 [節點名稱(如果有)= JV,列名= RES_CODE] – Colin 2009-08-24 14:49:59

+1

當我嘗試語法時出現此錯誤:「解析查詢時出現錯誤[令牌行號= 2,令牌行偏移量= 2,令牌在錯誤= SELECT]「 我相信Sql CE不支持返回標量值的子查詢。 – Colin 2009-08-25 09:45:20

+0

在這種情況下,我不相信你可以在單個查詢中做到這一點。您必須在一個查詢中爲變量分配一個值,然後在第二個變量中使用該變量進行更新。 – 2009-08-25 10:29:34