如何从另一个表更新 Sql Server CE 表
Posted
技术标签:
【中文标题】如何从另一个表更新 Sql Server CE 表【英文标题】:How to do Sql Server CE table update from another table 【发布时间】:2009-08-21 10:44:32 【问题描述】:我有这个 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个具有相同值的参数,但是有人知道如何更好地做到这一点吗?
科林
【问题讨论】:
更新答案以涵盖您问题的第二部分。 【参考方案1】:您的第二次尝试不起作用,因为基于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 的局限性,因为它们与 cmets 中提出的问题有关(如何使用 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 中的多行,则此查询将失败。 如果这不起作用(或者您不能直接将内部查询限制为每外部行单行),则可以使用游标执行逐行更新。
【讨论】:
这当然适用于我的特定场景。谢谢。但是,如果我想更新 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] 我在尝试该语法时收到此错误:“解析查询时出错。[令牌行号 = 2,令牌行偏移量 = 2,错误中的令牌 = SELECT]”我相信Sql CE 不支持返回标量值的子查询。 在这种情况下,我不相信您可以在单个查询中做到这一点。您必须在一个查询中为变量赋值,然后在第二个查询中使用该变量进行更新。 谢谢埃德。你回答了我的问题。以上是关于如何从另一个表更新 Sql Server CE 表的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 SQL Server CE 3.5 中是不是存在表
如何阻止 SQL Server CE 3.5 更改跟踪表无限增长?