2011-01-30 55 views
0

我想先加载数据而不首先创建表,因此创建的表将基于配置文件,因为文件与固定宽度字段,默认情况下它将使用LENGTH作为最大varchar长度,例如,如果LENGTH =“18”(第一列),则该列将被创建为varchar(18)。但我需要创建所有列的长度相同,如varchar(100),如何做到这一点? (另一个故事:为什么我需要它,因为当UNPIVOT的表,它需要与相同长度的所有列)如何将所有列的修复宽度csv文件批量加载到具有相同长度的表中

<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

我明显错过了一些东西,但为什么不把所有的长度=语句设置为所有列的最大长度? – 2011-01-30 02:20:04

回答

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 

相关问题