如何从另一个表执行Sql Server CE表更新

时间:2009-08-21 10:44:33

标签: sql-server sql-server-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)

直到我把它变成参数化查询:

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个参数,但有人知道如何更好地做到这一点吗?

科林

1 个答案:

答案 0 :(得分:5)

您的第二次尝试不起作用,因为基于Books On-Line entry for UPDATE,SQL CE不允许在更新语句中使用FROM子句。

我没有SQL Compact Edition来测试它,但这可能有效:

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的局限性,因为它们与注释中提出的问题有关(如何使用JOBVISIT中的值更新JOBMAKE中的值)。尝试在外部查询中引用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中的多行,则此查询将失败。 如果这不起作用(或者你不能直接将内部查询限制为每个外行的一行),则可以使用游标执行逐行更新。