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

Col*_*lin 4 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)
Run Code Online (Sandbox Code Playgroud)

它一直有效,直到我把它变成参数化查询:

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 ]
Run Code Online (Sandbox Code Playgroud)

我试过这个(我认为它可以在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 ]
Run Code Online (Sandbox Code Playgroud)

所以,我可以编写动态sql而不是使用参数,或者我可以传递2个具有相同值的参数,但有人知道如何更好地做到这一点吗?

科林

Ed *_*per 5

您的第二次尝试不起作用,因为基于UPDATEBooks On-Line条目,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
             )
Run Code Online (Sandbox Code Playgroud)

可能是您可以将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
                 )
Run Code Online (Sandbox Code Playgroud)

但是,有一个限制.如果为JOBMAKE中的每一行重新调整JOBVISIT中的多行,则此查询将失败.如果这不起作用(或者您不能直接将内部查询限制为每个外行的单个行),则可以使用游标执行逐行更新.

  • 当我尝试该语法时出现此错误:“解析查询时出错。[令牌行号= 2,令牌行偏移= 2,令牌错误= SELECT]”我相信Sql CE不支持子查询返回标量值。 (2认同)