SQL ServerへのInsertで「右側が切り捨てられました」のエラー

あまりに悩んで無駄な時間をすごしたので自分のメモ。まあいわゆるハマリというやつですね。

 

ADOQueryなどでSQL ServerへInsertした場合に

[Microsoft][ODBC SQL Server Driver]文字列データの右側が切り捨てられました

というエラーが出るときがあります。

通常はそのままの意味で、データに対してフィールドの容量が足りない場合にでるのですが、ややこしいことにまったく同じメッセージで別の内容の場合があります。

今回はこれでハマリました。

発生状況

実は使用状況によってはテーブルに書き込み権限が不足している場合に発生します。

わかってしまえばケアレスミスなのですが、メッセージの意味どおりにデバッグしていくと絶対に答えにたどり着きません!

テスト方法

状況をテストするにはベタのSQLでテストするのが良いです。

QueryのSQLにパラメタ形式で代入していたのですが、ベタのSQLに切り替えてみました。(phpでのテスト時)

INSERT INTO table1 (d1, d2, d3) VALUES (:v1, :v2, :v3)

Format('INSERT INTO table1 (d1, d2, d3) VALUES (%s, %s, %s)',[...]);

にしました。

すると、なんとメッセージが

EOLEException [Microsoft][ODBC SQL Server Driver] Insert権限は、オブジェクト’table1’、データベース ‘db’、所有者 ‘dbo’にありません

と変わってるじゃないか!

なんたることだ!

 

テーブルを作り直したり投入データを変えたりSQLを変えたり数時間・・・

さらにSQL Server Enterprise Managerからでは普通に投入できる・・・(考えてみればManagerはスーパーユーザで動いているから当たり前です。しかし頭が大混乱状態のときは権限なんて思いもつかないものです・・・)

3時間は無駄にした!
つかれたので休憩~~~(泣)