我有这个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个参数,但有人知道如何更好地做到这一点吗?
科林
答案 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中的多行,则此查询将失败。 如果这不起作用(或者你不能直接将内部查询限制为每个外行的一行),则可以使用游标执行逐行更新。