如何从另一个表更新 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 查询从另一个表中更新作为下拉列表的字段

如何检查 SQL Server CE 3.5 中是不是存在表

SQL Server CE:如果存在更新,否则插入

如何阻止 SQL Server CE 3.5 更改跟踪表无限增长?

如何在 Visual Studio 2012 中查看 SQL Server CE 系统表

如何将表添加到 Windows Phone 上已部署的 SQL Server CE 数据库?