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个具有相同值的参数,但有人知道如何更好地做到这一点吗?
科林
您的第二次尝试不起作用,因为基于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
)
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中的多行,则此查询将失败.如果这不起作用(或者您不能直接将内部查询限制为每个外行的单个行),则可以使用游标执行逐行更新.
| 归档时间: |
|
| 查看次数: |
11726 次 |
| 最近记录: |