SQLServer からのデータ移行(varbinary)
SQLServer からのデータ移行(varbinary)
SQLServer 2000 から PostgreSQL 8.4.3 へデータ移行を考えているのですが、
つまずいて困っています。
ご存知の方がいらっしゃいましたら教えていただけないでしょうか。
あるテーブル上にvarbinary(32)の項目があり、
クエリアナライザで見ると「0x11223344・・・」という値が入っているのですが、
PostgreSQL側ではこの項目のデータ型はどう定義したらよいでしょうか。
character varying(32)としてみましたが、
定義がふさわしくないのか、SQLがまずいのか、思うようにINSERTができませんでした。
たとえば、
insert into ... values(0x1122334455667788990011223344556677889900112233445566778899001122, ...)
とすると
---
NOTICE: 識別子"x1122334455667788990011223344556677889900112233445566778899001122"を"x11223344556677889900112233445566778899001122334455667788990011"に切り詰めます
SQLステート:42601
---
が返りますし
insert into ... values(x'1122334455667788990011223344556677889900112233445566778899001122', ...)
では
---
ERROR: 値は型character varying(32)としては長すぎます
SQLステート:22001
---
が返ります。
実際は、.Net C# のプログラムにてDataTableにSQLServerからデータをFillして、それを元にINSERT文を作成しています。
デバッグすると、Byte配列に[0]17,[1]34... という具合に入ってくるので
if ((col.DataType == typeof(String)) || (col.DataType == typeof(DateTime)) ||(col.DataType == typeof(Decimal)) )
{
valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString());
}
else if(col.DataType == typeof(Byte[]))
{
string tmp = "";
for (int i = 0; i < ((Byte[])row[col.ColumnName]).Length; i++)
{
tmp += (string.Format("{0:X2}", ((Byte[])row[col.ColumnName])[i]));
}
valueColumns.AppendFormat("x'{0}',", tmp);
}
else
{
valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString());
}
のようにDataType別に振り分けて、上記else ifが通るようにコーディングしています。
よろしくお願いいたします。