3

SQL Server Compact Edition 4.0 で 2 つのテーブル間の値を更新しようとしています。私の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 ステートメントが参照できる唯一のデータは、更新される行のデータです。

これを回避するために私が見つけた方法は 2 つだけ
です

1つ目は、CEが(私の知る限り)どのように機能することを意図しているかです。たとえば、T-SQL がないため、IF ブロックやその他の手続き型ロジックは、SQL ではなくアプリケーションに埋め込む必要があります。

2 番目は、トリガーでの UPDATE の外観を模倣します。削除と挿入。これを可能にするためにデータを再構築すれば、非常に効果的です。

どちらも「優れた」ものではありませんが、CE は「回避できる最小限のもの」であることを意味しています。少し派手な永続化エンジン (ファンクで柔軟な形式でディスクに保存する) であり、実際のデータベース エンジンではないようです。

ただし、その制限とそれらを回避する方法に慣れると、非常に便利になる可能性があります。特定のタスク用。

于 2011-08-03T23:17:09.600 に答える
1

SQL 内に留まるには、いくつかのオプションがあります。

  1. 新しい値を挿入し、古い値を削除します (主キーがない場合)
  2. 新しい値を一時テーブルに挿入してから、古い値を削除してから挿入し直します (このために ID 挿入をオンにする必要がある場合がありますが、外部キー制約がある場合、これは壊れます)。
  3. カーソルと動的 SQL を使用して、行を 1 つずつ更新します。

編集:#3について何を考えていたのか、何を考えていたのかわかりません...「SQL Server Compact 4.0では、API関数を使用するだけでカーソルを要求できます。」http://msdn.microsoft.com/en-us/library/ms172364(SQL.110).aspxから

于 2011-08-03T23:37:47.330 に答える