Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将固定宽度csv文件批量加载到所有列长度相同的表中_Sql_Sql Server_Bulkinsert_Fixed - Fatal编程技术网

Sql 如何将固定宽度csv文件批量加载到所有列长度相同的表中

Sql 如何将固定宽度csv文件批量加载到所有列长度相同的表中,sql,sql-server,bulkinsert,fixed,Sql,Sql Server,Bulkinsert,Fixed,我希望在不首先创建表的情况下加载数据,因此创建的表将基于配置文件,因为该文件具有固定宽度字段,默认情况下,它将使用长度作为最大varchar长度,例如如果LENGTH=“18”(第一列),则该列将创建为varchar(18)。但是我需要创建长度相同的所有列,比如varchar(100),如何做到这一点?(另一个故事:为什么我需要它,因为当取消Pivot表时,它需要所有长度相同的列) 您可以从输入文件动态构建全局临时表 最初,csv文件被加载到一个包含一列的临时表中。然后构建SQL语句以创建全局临

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


您可以从输入文件动态构建全局临时表

最初,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


我显然遗漏了一些东西,但是为什么不将所有length=语句设置为所有列的最大长度呢?我使用这种解决方法:首先创建一个长度相同的表,然后插入到这个表中。但是如果我们更改了文件格式,我们还需要更改表定义。如果我可以使用openrowset(..)中的select*into选项卡,并且sql server可以自动创建一个具有相同长度的所有列的表,那么我不需要更改每个加载文件的代码

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