質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

919閲覧

ACCESSのローカルテーブルをSQLSERVERにあげたところSQLでエラーがでます

masaki777

総合スコア14

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

1グッド

0クリップ

投稿2018/12/20 07:24

トラブル内容はタイトルのとおりです。
**
以下のようなSQLでODBCエラーとなります。
**
sql = "UPDATE WT_入金 LEFT JOIN T_入金 ON " _
& "(WT_入金.締め日 = T_入金.締め日) AND (WT_入金.sime_cd = T_入金.sime_cd) AND " _
& "(WT_入金.NYUIN_SU = T_入金.NYUIN_SU) AND (WT_入金.riyou_no = T_入金.riyou_no) " _
& "SET T_入金.riyou_no = [WT_入金]![riyou_no], T_入金.hp = [WT_入金]![hp], T_入金.NYUIN_DATE = [WT_入金]![nyuin_date], " _
& "T_入金.seikyu_gak = [WT_入金]![seikyu_gak], T_入金.nyukin_gak = [WT_入金]![nyukin_gak] " _
& "WHERE WT_入金.riyou_gak <> T_入金.riyou_gak or WT_入金.riyou_gak <> 0"

T_入金はSQLSERVERにあり、ODBCでリンクしています。WT_入金はローカルのワークテーブルです。
ワークテーブルを更新したものは該当レコードを更新、本番テーブルにレコードのないものは追加としたく、以上のようなSQLにしています。ローカルにテーブルがあったときは、問題なかったのですが、SQLSERVERからのリンクとした途端にエラーとなりました。

ちなみにON句のリレーションが合わないレコードが1件でもあるとエラーとなり、ない場合はエラーは起こりません。お知恵をお願いします。

sazi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/12/20 10:04

因みに、エラーの詳細はどのようなものでしょう
masaki777

2018/12/20 10:35

何度も回答ありがとうございます ODBC呼び出しが失敗しました。が出ます。イミディエイトウインドウで?DBEngine.errors(0)してみると、実行時エラー3001 引数が無効です。 と表示されます。
guest

回答1

0

ベストアンサー

ON句のリレーションが合わないレコードが1件でもあるとエラーとなり、ない場合はエラーは起こりません。

それが答えで、合わせれば解決という事ですね。

どのように合わないのか(型が違う、Nullの扱いなど)が不明な状態では回答の仕様がありませんけど。

追記

よく見るとleft joinですね。
updateはinner joinにして、データの無いT_入金にはinsertしないと駄目ですね。

追記

accessがupsertに対応しているとは知らなかった。。。
【Access】 あれば更新なければ追加

でも、SQLSERVERでは同じ事をしようとするとMERGEになるので、クエリーが自動でそこまで変換されるとは思えないので、エラーになるのじゃないかと。

投稿2018/12/20 08:02

編集2018/12/20 10:05
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaki777

2018/12/20 09:14

回答ありがとうございます。 リレーションが合わないのは実際に入っている数値です。型ではありあません。NULLも入っていません。 SQLに関してはこの書き方で、accessのローカルテーブルの時は更新と追加の両方できました。 実際にアップしているサイトもありました。
sazi

2018/12/20 09:41

>実際にアップしているサイトもありました URLを提示して貰えますか
masaki777

2018/12/20 10:25

すみません、先にあげてもらてってましたね。追記を確認してませんでした。
sazi

2018/12/20 10:43 編集

「引数が無効です。」とは、厄介なエラーですね。 サイズが大きくなって破損しかかっていると起きたりもしますので、「最適化/修復」を行ってみてください ※事前にバックアップは忘れずに!!
masaki777

2018/12/20 10:59

回答ありがとうございます。 最適化はACCESSの方でしょうか?ACCESSの方は9M程度です。追加しようとしているのはsqlserverの方ですが、そちらのDBを最適化ということでしょうか?
sazi

2018/12/20 11:40

最適化はaccessの方です。
masaki777

2018/12/20 11:59

ちなみに別にもワークテーブルから本番テーブルへ書き込む処理がありますが、そちらは問題なく処理できております。
sazi

2018/12/20 12:30 編集

同様なクエリーで追加ができているという事ですか? もしそうなら、結合条件が一意キーやユニークキーを含んでいるかに違いが無いでしょうか?
masaki777

2018/12/20 23:23

回答ありがとうございます。 問題なく処理のできている方では、本番テーブル側がすべて主キーで結合しています。うまく処理のできない方では、訳があってidentityを設定した列をキーにしており、エラー処理時のクエリでは結合していません。一度テーブル構造を変えて試してみます。
masaki777

2018/12/21 00:28

ありがとうございます。 キーを変更すれば更新、追加が可能でした。追加時のみエラーが出ておりましたが、追加も問題なくできるようになりました。入金データに重複が見られたので、オートナンバー型の列を作成していた模様です。
sazi

2018/12/21 00:35

個人的にはAccessの機能の一面を知れて良かった。 因みに、このupsert機能について、公式の情報をご存知でしょうか?
masaki777

2018/12/21 07:38

いえ、公式は存じ上げてはおりません。更新と追加と2つ書くのが手間だったので探していたらたまたま見つけた次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問