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

Sql server 如何从另一个表更新Sql Server CE表,sql-server,sql-server-ce,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='10sche

我有一个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而不是使用参数,或者我可以传入两个具有相同值的参数,但是有人知道如何更好地做到这一点吗


Colin

您的第二次尝试无效,因为根据,SQL CE不允许在update语句中使用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中的值。我遇到的任何SQL方言都不支持尝试在外部查询中引用EXISTS子句的内容,但是您可以尝试另一种方法。这未经测试,但可能有效,因为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中的多行,则此查询将失败。
如果这不起作用,或者您不能直接将内部查询限制为每外行一行,则可以使用光标执行逐行更新。

这当然适用于我的特定场景。多谢各位。但是,如果我想从JobVisite表中更新到一个值,我该怎么做呢?我尝试了测试更新JOBMAKE SET WIP_STATUS=JV.RES_CODE(如果存在)从JobVisite中选择1作为JV,其中JV.JBT_TYPE=JOBMAKE.JBT_TYPE和JV.JOB_NUMBER=JOBMAKE.JOB_NUMBER和JV.JVST_ID=20列名无效。[Node name if any=JV,Column name=RES_CODE]我在尝试该语法时遇到此错误:解析查询时出错。[Token line number=2,Token line offset=2,Token in error=SELECT]我认为Sql CE不支持返回标量值的子查询。在这种情况下,我不相信您可以在单个查询中实现这一点。您必须在一个查询中为变量赋值,然后在第二个查询中使用该变量进行更新。谢谢Ed。您回答了我的问题。更新的答案涵盖了问题的第二部分。