Как загрузить CSV-файл с фиксированной шириной в таблицу одинаковой длины для всех столбцов - PullRequest
0 голосов
/ 30 января 2011

Я хочу загрузить данные без создания таблицы, поэтому созданная таблица будет основана на файле конфигурации, так как файл имеет поле с фиксированной шириной, по умолчанию он будет использовать ДЛИНУ в качестве максимальной длины varchar,как если бы LENGTH = "18" (первый столбец), столбец будет создан как varchar (18).Но мне нужно, чтобы все столбцы создавались одинаковой длины, например, varchar (100), как это сделать?(другая история: зачем мне это нужно, потому что при отключении таблицы нужны все столбцы одинаковой длины)

<RECORD>
  <FIELD ID="1" xsi:type="CharFixed" LENGTH="18" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="2" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharFixed" LENGTH="18" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="4" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="5" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="6" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="7" xsi:type="CharFixed" LENGTH="18" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="8" xsi:type="CharFixed" LENGTH="2" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="9" xsi:type="CharFixed" LENGTH="5" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="10" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="5" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>

1 Ответ

1 голос
/ 05 марта 2011

Вы можете динамически построить глобальную временную таблицу из входного файла.

Первоначально файл CSV загружается во временную таблицу с одним столбцом.Затем операторы SQL создаются для создания глобальной временной таблицы, а затем снова для ее массового копирования.

Обратите внимание , что FIELDTERMINATOR = ',' изменяется во второй массовой копии.


declare @ix int; 

-- bulk insert into a table with one row
create table #CSV (Col1 varchar(8000))

BULK INSERT #CSV
FROM 'c:\temp\BulkCopyTest.txt'
WITH (FIELDTERMINATOR = '||', ROWTERMINATOR = '\n', FIRSTROW=1)

-- dynamically create a CREATE TABLE statement
declare @CreateTableSQL varchar(8000);
set @CreateTableSQL = 'create table ##T (';

declare @Row varchar(8000);
select top 1 @Row = col1 from #CSV;

-- split apart the row
set @ix = 1;
while (charindex(',',@Row)>0)
begin
    set @CreateTableSQL = @CreateTableSQL + 'COL'+convert(varchar,@ix)+' varchar(100), ';
    set @Row = substring(@Row,charindex(',',@Row)+1,len(@Row))
    set @ix = @ix + 1
end
set @CreateTableSQL = @CreateTableSQL + 'COL'+convert(varchar,@ix)+' varchar(100))';

-- create the temp table
exec( @CreateTableSQL );

-- populate the temp table
BULK INSERT ##T
FROM 'c:\temp\BulkCopyTest.txt'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW=1)


select * from ##T;
.
.
.
drop table ##T
drop table #CSV

...