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

4

我有这个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


更新答案以涵盖您问题的第二部分。 - Ed Harper
1个回答

5
你的第二次尝试不起作用,因为根据UPDATE的Books 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
             )

可能你可以将JOBMAKE设置为JM的别名,以使查询略微缩短。
编辑
我不确定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,则此查询将失败。 如果这种方法不起作用(或者您无法直接将内部查询限制为每个外部行的单个行),可以使用游标逐行更新。


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
2
当我尝试使用该语法时,出现了以下错误:"解析查询时发生错误。[令牌行号=2,令牌行偏移量=2,错误的令牌=SELECT]" 我认为Sql CE不支持返回标量值的子查询。 - Colin
在这种情况下,我不认为您可以在单个查询中完成此操作。您需要在一个查询中将值分配给变量,然后在第二个查询中使用该变量进行更新。 - Ed Harper
谢谢Ed。你回答了我的问题。 - Colin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接