3

我正在尝试更新 sql server compact edition 4.0 中两个表之间的值。我的sql如下:

UPDATE ei SET ei.EstateID=e.EstateID FROM EstateImages ei
    INNER JOIN Estates e ON e.TempKey=ei.TempKey

也试过这个:

UPDATE EstateImages SET EstateID = 
    (SELECT EstateID FROM Estates WHERE TempKey = EstateImages.TempKey)

我有错误:

There was an error parsing the query.
[ Token line number = 1, Token line offset = 37, Token error = SELECT ]
4

3 回答 3

7

如果您查看联机丛书或其他参考资料,您会发现您无法在 SQL Server CE 中执行此操作。
- 无 FROM 子句
- 无相关子查询

基本上,UPDATE 语句可以引用的唯一数据是正在更新的行中的数据。

我发现只有两种方法可以解决这个问题:
1. 客户端应用程序运行一个选择,然后触发一个或多个直接更新
2. 插入新值,然后删除旧值

第一个几乎是CE(据我所知)打算如何工作。例如,没有 T-SQL,因此需要将 IF 块和其他过程逻辑嵌入到应用程序中,而不是 SQL。

第二个模仿 UPDATE 在触发器中的样子;一个删除和一个插入。并且只要您重新构建数据以使其成为可能,它就会非常有效。

两者都不是“伟大的”,但 CE 真的意味着“你可以逃脱的最少”。它更像是一个稍微浮华的持久性引擎(以一种放克灵活的格式将内容保存到磁盘),而不是一个真正的数据库引擎。

但是,一旦您习惯了它的局限性以及解决它们的方法,它就会非常有用。对于特定的任务。

于 2011-08-03T23:17:09.600 回答
1

您有几个选项可以在 SQL 中执行此操作:

  1. 插入新值并删除旧值(假设没有主键)
  2. 将新值插入临时表,然后删除旧值,然后将它们重新插入(您可能需要为此打开标识插入,但是如果您有外键约束,这将中断)
  3. 使用游标和动态 SQL 逐一更新行

编辑:不知道我在想什么#3,不知道我在想什么......“在 SQL Server Compact 4.0 中,只能通过使用 API 函数来请求游标。” 来自http://msdn.microsoft.com/en-us/library/ms172364(SQL.110).aspx

于 2011-08-03T23:37:47.330 回答
-1

我在 DELETE 操作中遇到了同样的问题,但是我通过这种方式对其进行了排序。

DELETE FROM exSetData 
WHERE EXISTS 
(
       SELECT * FROM Exercise 
       WHERE Exercise.Name = exSetData.exName 
       AND Exercise.Day = @name
)

希望它在您的 UPDATE 操作中对您有用.. 值得深思的可能是..

于 2016-10-17T09:20:36.963 回答