本日は同じテーブルに対して2回SQLを実行し、その後ローカルのデータテーブルでマージを行った所、
なぜかデータ型の不一致と怒られた話し。
問題のSQL
単純にカラムYが1の場合( code1 )と0の場合( code2 )それぞれの、IDとZカラムの内容に応じた数値MERGEの情報を欲っするSQL。
Zカラムはtinyint
code1:SQL
1 2 3 4 5 |
SELECT ID , CASE WHEN Z = 1 THEN 1 ELSE 0 END AS MERGE FROM X WHERE Y = 1 |
code2:SQL
1 2 3 4 5 |
SELECT ID , 0 AS MERGE FROM X WHERE Y = 0 |
で、それぞれ取得した情報をデータテーブル(Dt1とDt2)に持ち、第三のデータテーブル(Dt3)にマージを行う。
code3:C#
1 2 |
Dt3 = Dt1.Copy(); Dt3.Merge(Dt2.Copy()); |
するとDt3.Merge(Dt2.Copy())にて、、、
原因は?
警告を見た感じ「.MERGE と .MERGE は競合するプロパティがあります : DataType プロパティの不一致」との事。
同じテーブルのマージなんだからUNION ALLみたいなもんなのに…??
まぁ言っててもしょうがないので原因を探る事に。
※ちなみにNullは許容してません。
とりあえず DataType プロパティの不一致とあるので、取得後のMERGEカラムのデータ型を見てみる。
1 2 |
string SQL1 = Dt1.Columns["MERGE"].DataType.ToString(); string SQL2 = Dt2.Columns["MERGE"].DataType.ToString(); |
すると、なんとデータ型がSystem.Int64だったり32だったり、
SQLを実行する度まちまちな模様。
ちなみにSQL2をCASE WHEN Z = 1 THEN 0 ELSE 0 END AS MERGE とかやってみても合いませんでした。これは頂けない!
CASTするにしてもCONVARTするにしても32か64かの指定は出来ないし、
データテーブルにデータをねじ込んだ後にデータタイプの変更も出来ず。。。
原因不明の罠にハマりもがき続ける事数十分、結局’0’として無理やりstring型で返させて逃げました。
まとめ
普通に使う分にはとても便利なので結構な頻度で出現するCASE式ですが、
THEN で返す値を数値にする場合は32でも64でもどちらでも良い場合だけにしときましょう(ᵔᴥᵔ)
コメント