一括挿入でエラーが発生する

私は、拡張子が ".dat" のソースファイルを持っており、SSMSでテーブルとしてそれをロードしたいと思っています。私のコードは以下の通りです。

しかし、以下のエラーが発生します。また、Notepad++でファイルを開き、ROWTERMINATORを確認したところ、LFになっているようです。

Msg 4866, レベル16, ステート8, ライン34 バルクロードに失敗しました。データファイルの1行目、25列目のカラムが長すぎます。フィールドターミネータとロウターミネータが正しく指定されているか確認してください。 Msg 7301, レベル 16, ステート 2, 行 34 OLE DB プロバイダー "BULK" からリンクされたサーバー "(null)" に対して必要なインターフェイス ("IID_IColumnsInfo") を取得できません

コード

USE myDB
GO
CREATE TABLE [dbo].[myTable]

(
Column1 NVARCHAR(255) NULL,
Column2 NVARCHAR(255) NULL,
Column3 NVARCHAR(100) NULL,
Column4 NVARCHAR(255) NULL,
Column5 NVARCHAR(255) NULL,
Column6 NVARCHAR(255) NULL,
Column7  NVARCHAR(255) NULL,
Column8  NVARCHAR(255) NULL,
Column9  NVARCHAR(255) NULL,
Column10  NVARCHAR(255) NULL,
Column11  NVARCHAR(255) NULL,
Column12 NVARCHAR(255) NULL,
Column13  NVARCHAR(255) NULL,
Column14 NVARCHAR(255) NULL,
Column15  NVARCHAR(255) NULL,
Column16 NVARCHAR(255) NULL,
Column17  NVARCHAR(255) NULL,
Column18  NVARCHAR(255) NULL,
Column19  NVARCHAR(255) NULL,
Column20  NVARCHAR(255) NULL,
Column21  NVARCHAR(255) NULL,
Column22 NVARCHAR(255) NULL,
Column23 NVARCHAR(255) NULL,
Column24 NVARCHAR(255) NULL,
Column25 NVARCHAR(255) NULL
);

BULK 
INSERT [dbo].[myTable]
FROM 'C:\Users\John\Documents\work\MyFile.dat'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
);
SELECT * FROM [dbo].[myTable]

以下は、データのサンプルで、まさにSSMSが失敗している行です。

カンザスシティ 1 494124 20 マクドナルド KANSAS CUSTOMERS 22 WYANDOTTE COUNTY 239 Wyandotte County 964 S 73RD ST KANSAS CITY KS 66111 2805 Y Y N 4 D Old School Loyal N 49412401` です。

これは私が働いているところではよくある問題です。改行がある場合、論理的には ROWTERMINATOR = '\n' とすると、bcp はそれに r を追加してしまうのです。

bcpをインタラクティブに使用して、行の終端記号に(改行)を指定した場合、bcpは`````を追加します。 bcpをインタラクティブに使用して、行のターミネーターに⾳を指定すると、bcpは自動的にその前に⾳をつけます。 という文字が前置され、その結果、行の終端記号は \rn となります。 (出典)

あなたのケースで役に立つかどうかわかりませんが、ROWTERMINATOR = "0x0a" とすれば、全く問題なく動作しますよ。

**編集

あなたのコメントでは、9列のテーブルに25列を挿入しようとしていると言っています。明らかにそれはうまくいきません。まず、カラム数を修正する必要があります。

解説 (10)

ユーザーデータベース認証がバルクインサートにアクセスできることを確認してください。 ユーザーが SQL Server ログインを使用する場合、SQL Server プロセス アカウントのセキュリティ プロファイルが使用されます。SQL Server 認証を使用するログインは、データベースエンジンの外部で認証することはできません。したがって、SQL Server 認証を使用するログインによって BULK INSERT コマンドが開始されると、データへの接続は SQL Server プロセス アカウント (SQL Server Database Engine サービスで使用されるアカウント) のセキュリティ コンテキストを使用して行われます。 ソース データを正常に読み取るには、SQL Server Database Engine が使用するアカウントに、ソース データへのアクセス権を付与する必要があります。一方、SQL Server のユーザーが Windows 認証を使用してログオンした場合、SQL Server プロセスのセキュリティ プロファイルに関係なく、そのユーザー アカウントでアクセス可能なファイルのみを読み取ることができます。

たとえば、Windows 認証を使用して SQL Server のインスタンスにログインしたユーザーを考えてみましょう。このユーザーがBULK INSERTまたはOPENROWSETを使用して、データファイルからSQL Serverのテーブルにデータをインポートできるようにするには、ユーザーアカウントはデータファイルへの読み取りアクセスを必要とします。データ ファイルへのアクセス権があれば、SQL Server プロセスがファイルへのアクセス権限を持っていなくても、ユーザーはファイルからテーブルにデータをインポートできます。ユーザーは、SQL Server プロセスにファイル アクセス権限を付与する必要はありません。

データベースへの一括挿入のアクセス権を持っている場合 datファイルのdatatypeとdatalenを確認してください。

解説 (3)

ロウターミネーター = "0x0a"`.

勝利のために!

解説 (0)