水平テーブル(Table1)があり、それを(Table2)に変換するために必要です
表1:
CEO SALESMAN PRODUCT(1) PRODUCT(2) PRODUCT(3) PRODUCT(4) PRODUCT(5) ... PRODUCT(N)
------ ---------- ---------- ---------- ---------- ---------- ---------- ----------
MIKE ANDERSON 76787,00 19388,00 0,00 2723,00 217,00 6581,00
JOHN ANGELA 0,00 0,00 73088,00 0,00 0,00 0,00
JACK JEFF 24716,00 0,00 2995,00 0,00 0,00 0,00
STUART MICHAEL 0,00 23338,00 42656,00 0,00 0,00 0,00
表2:
CEO SALESMAN PRODUCTS VALUE
------- ----------- ---------- --------
MIKE ANDERSON PRODUCT(1) 76787,00
JOHN ANGELA PRODUCT(1) 0,00
JACK JEFF PRODUCT(1) 24716,00
STUART MICHAEL PRODUCT(1) 0,00
MIKE ANDERSON PRODUCT(2) 19388,00
JOHN ANGELA PRODUCT(2) 0,00
JACK JEFF PRODUCT(2) 0,00
STUART MICHAEL PRODUCT(2) 23338,00
MIKE ANDERSON PRODUCT(3) 0,00
JOHN ANGELA PRODUCT(3) 73088,00
JACK JEFF PRODUCT(3) 2995,00
STUART MICHAEL PRODUCT(3) 42656,00
MIKE ANDERSON PRODUCT(4) 2723,00
JOHN ANGELA PRODUCT(4) 0,00
JACK JEFF PRODUCT(4) 0,00
STUART MICHAEL PRODUCT(4) 0,00
MIKE ANDERSON PRODUCT(5) 217,00
JOHN ANGELA PRODUCT(5) 0,00
JACK JEFF PRODUCT(5) 0,00
STUART MICHAEL PRODUCT(5) 0,00
MIKE ANDERSON ... ...
JOHN ANGELA ... ...
JACK JEFF ... ...
STUART MICHAEL ... ...
MIKE ANDERSON PRODUCT(N) 6581,00
JOHN ANGELA PRODUCT(N) 0,00
JACK JEFF PRODUCT(N) 0,00
STUART MICHAEL PRODUCT(N) 0,00
これまでに試したのは、Table1を一時テーブルにBULK INSERTしてから、必要なデータが得られるまでこのデータを処理することです。問題は、PRODUCT()列のNが可変であるため、固定列の一時テーブルを作成できず、製品列の数量を読み取って処理できる動的クエリが必要なことです。
バルクインサート
BULK INSERT #temp
FROM '\\path\file.csv'
WITH
(
FIRSTROW = 1,
FIELDTERMINATOR= ';',
ROWTERMINATOR = '\n',
CODEPAGE='RAW'
);
一時的なテーブル:
CREATE TABLE #temp(
col1 varchar(100) null,
col2 varchar(100) null,
col3 varchar(100) null,
col4 varchar(100) null,
col5 varchar(100) null,
...
col397 varchar(100) null,
col398 varchar(100) null,
col399 varchar(100) null,
col400 varchar(100) null
)
BULK INSERTを実行すると、次のエラーが発生します。
Msg 4832, Level 16, State 1, Line 1
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
これは、固定400列の一時テーブルを作成し、127個の製品列があったために発生します。
私はこれらのようなことを避けようとしています:
DECLARE @NUM_ROWS INT
SET @NUM_ROWS = 123
IF @NUM_ROWS = 1
BEGIN
CREATE TABLE #temp(
col1 varchar(100) null
)
END
IF @NUM_ROWS = 2
BEGIN
CREATE TABLE #temp(
col1 varchar(100) null,
col2 varchar(100) null,
)
END
...
IF @NUM_ROWS = 400
BEGIN
CREATE TABLE #temp(
col1 varchar(100) null,
col2 varchar(100) null,
...
col4 varchar(100) null,
)
END
BULK INSERT #temp
FROM '\\path\file.csv'
WITH
(
FIRSTROW = 1,
FIELDTERMINATOR= ';',
ROWTERMINATOR = '\n',
CODEPAGE='RAW'
);
@NUM_ROWSは、一時テーブルを作成する列の数になります。
この.csvファイルをSQLServerに動的にインポートする方法を知っている人はいますか?動的とは、一括挿入するPRODUCTSの列数を使用して一時テーブルを作成することを意味します。または、上記で投稿したエラーを回避するための回避策。