SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法

SQL Serer Management Studio の SQL Server インポートおよびエクスポートウィザードを使って Excel ファイルのデータを SQL Server のデータベースにインポートすることがあると思います。

便利な機能ですが、セルに 255 文字より多い文字数が入っている時に、255 文字で切れてインポートされることがあります。

この記事では、255 文字でデータが切り捨てされないようにする方法をご紹介します。

Excel インポートで 255 文字で切り捨てされる現象の再現

まずは、Excel インポートで 255 文字で切り捨てされる現象を再現してみます。

次のような Excel ファイルを SQL Server インポートおよびエクスポートウィザードを使って、ローカルにある Test1 というデータベースにインポートします。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 1


Item20 の ItemDescription には、長さが 380 の文字列が入っています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 2


この Items.xlsx ファイルを SQL Server インポートおよびエクスポートウィザードを使ってインポートします。

SQL Server Management Studio - Excel ファイルをインポートする方法の詳細を知りたい方は、SQL Server Management Studio - Excel ファイルをインポートする をご覧ください。

データソースに Items.xlsx ファイルを指定します。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 3


変換先にローカルの Test1 データベースを指定します。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 4


変更先のテーブル名を Temp_Items に変更して、[マッピングの編集] ボタンをクリックします。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 6


ItemDescription の Size が 255 になっていて、後で結果がわかりますが、ここで max に変更してもデータは 255 文字で切り捨てられてしまいます。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 7

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 8


この状態でウィザードを進め、データをインポートします。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 12


Test1 データベースを確認すると、Temp_Items という名前のテーブルができていて、ItemDescription のデータ型は NVARCHAR(MAX) になっています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 13


ですが、Temp_Items テーブルのデータを確認すると、Item20 の ItemDescription の長さは 255 になっています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 14


Excel インポートで 255 文字で切り捨てされる原因と対処方法

このように SQL Server インポートおよびエクスポートウィザードを使って Excel ファイルのデータを SQL Server のデータベースにインポートしたときに 255 文字で切り捨てられることがある原因は、ドライバーがデータ型を決定する際の設定にあります。

デフォルトでは、カラムのデータ型を調べるのに、最初の 8 行分のデータを確認して、最も多いデータ型に決定されるようになっています。

ですので、最初の 8 行目までに文字数の多いデータが入っていれば大丈夫なのですが、そうでないと、今回のように 255 文字で切れてしまいます。


データ型を調べる行数は TypeGuessRows というエントリで設定されています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 14-2

[参考] Microsoft Office Excel ドライバーの初期化


ドライバーはレジストリにある TypeGuessRows の値を使うので、その値を変更することによって、データ型を調べる行数をかえることができます。

Office 2016 の場合は TypeGuessRows の値は、以下の場所にありますが、HKEY_LOCAL_MACHINE の下で TypeGuessRows で検索すると出てくると思います。

[MSI インストールの場合]
* For 32-bit Office on 32-bit Windows or 64-bit Office on 64-bit Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel

* For 32-bit Office on 64-bit Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel

[システムのクイック実行インストールの場合]
* For 32-bit Office on 32-bit Windows or 64-bit Office on 64-bit Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel

* For 32-bit Office on 64-bit Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel


私の環境では HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Excel にありました。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 15


TypeGuessRows のデフォルトは 8 になっています。この値を 0 に設定すると、ドライバーは最初の 16,384 行をチェックします。

もしインポートする行数が 16,384 行を超える可能性があり、すべての行を確認したい場合は Excel の行の最大値の 1,048,576 を設定してください。

ここでは TypeGuessRows を 8 から 0 に変更します。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 16

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 17

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 18


Test1 データベースの Temp_Items テーブルを削除して、もう一度インポートしてみます。

[マッピングの編集] 画面では先ほど 255 だった部分が自動的に max になっています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 19


そのままウィザードを進め、データをインポートします。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 20


Test1 データベースを確認すると、Temp_Items テーブルができていて、ItemDescription のデータ型は NVARCHAR(MAX) になっています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 21


そして、Temp_Items テーブルのデータを確認すると、Item20 の ItemDescription の長さは、ちゃんと 380 になっています。

SQL Server - Excel からのデータインポートで 255 文字より多い文字数のデータをインポートする方法 22


最後に、長い文字列が入ってくる可能性のあるカラムがひとつしか存在せず、レコードの順番が重要でない場合、レジストリを変更せずに、一番長い文字列が入ってるレコードを上にもってくるように Excel でソートしてから、SQL Server にインポートするのもひとつの手かと思います。

以上、Exce から SQL Server へのデータインポートで 255 文字より多い文字数のデータをインポートする方法をご紹介しました。

© 2010-2024 SQL Server 入門