ОБНОВЛЕНИЕ двух ВНУТРЕННИХ СОЕДИНЕННЫХ таблиц в SQL Server Compact 4 - PullRequest
3 голосов
/ 04 августа 2011

Я пытаюсь обновить значения между двумя таблицами в 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 ]

Ответы [ 3 ]

6 голосов
/ 04 августа 2011

Если вы проверите Books Online или другие ссылки, вы обнаружите, что вы не можете сделать это в SQL Server CE.
- без пункта
- Нет коррелированных подзапросов

По сути, единственные данные, на которые может ссылаться инструкция UPDATE, - это данные в обновляемой строке.

Есть только два метода, которые я нашел, чтобы обойти это:
1. Клиентское приложение выполняет выбор, а затем запускает одно или несколько прямых обновлений
2. ВСТАВЬТЕ новые значения, затем УДАЛИТЕ старые значения

Первое, в значительной степени, как CE (насколько я знаю) предназначен для работы. Например, T-SQL не существует, поэтому в приложение должны быть встроены блоки IF и другая процедурная логика, а не SQL.

Вторая имитация того, как выглядит ОБНОВЛЕНИЕ в триггере; Удаление и вставка. И при условии, что вы реструктурируете свои данные, чтобы сделать это возможным, это весьма эффективно.

Ни один из них не является «великим», но тогда CE действительно должен быть «наименьшим, с чем вы можете сойти с рук». Похоже, что это скорее слегка броский движок персистенции (сохранение материала на диск в фанк-гибком формате), а не реальный движок базы данных.

Однако, как только вы привыкнете к его ограничениям и способам их обойти, это может быть довольно полезно. Для конкретных задач.

1 голос
/ 04 августа 2011

У вас есть несколько вариантов сделать это, оставаясь в SQL:

  1. Вставить новые значения и удалить старые значения (при условии, что нет первичного ключа)
  2. Вставить новые значения во временнуютаблицы, а затем удалите старые значения и затем вставьте их обратно (для этого может потребоваться включить идентификационную вставку, однако это будет нарушено, если у вас есть ограничения внешнего ключа)
  3. Используйте курсор и динамический SQL для обновленияряды одна за другой

Редактировать: понятия не имею, о чем я думал для # 3, понятия не имею, о чем я думаю ... "В SQL Server Compact 4.0 можно запросить курсор толькоиспользуя функции API. "От http://msdn.microsoft.com/en-us/library/ms172364(SQL.110).aspx

0 голосов
/ 17 октября 2016

У меня была такая же проблема с операцией УДАЛИТЬ, но я так ее отсортировал.

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

Надеюсь, это полезно для вас во время операции ОБНОВЛЕНИЕ .... Пища для размышлений может быть ..

...