我想在不创建表的情况下加载数据,因此创建的表将基于配置文件,因为文件具有固定宽度字段,默认情况下它将使用LENGTH作为最大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>
答案 0 :(得分:1)
您可以从输入文件动态构建全局临时表。
最初,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