使用的表结构:
create table mapTable(
inCsv varchar(max),
inSql varchar(max)
);
create table csvImported(
Name1 int,
Name2 int,
Name3 int
);
在这里,我假设您已经有一个导入了 csv 数据的表格。
所以,我用一些东西填充 csvImported 表,只是为了测试。地图表,同理。
填充mapTable表;
insert into mapTable values ('Name1', 'ID');
insert into mapTable values ('Name2', 'ID2');
insert into mapTable values ('Name3', 'ID3');
填充 csvImported 表;
insert into csvImported values (11, 122, 333);
insert into csvImported values (110, 1422, 37833);
insert into csvImported values (101, 1252, 33213);
所以,这里是过程定义。
CREATE PROCEDURE CREATE_TABLE_FROM_CSV(
@CsvTableName varchar(max),
@WantedTableName varchar(max)
) AS
SET NOCOUNT ON;
DECLARE @vColumnList varchar(max) = '',
@vColumnName varchar(max) = '',
@vColumnNameRenamed varchar(max) = '',
@vColumns TinyInt = 0,
@vTableNameInSql varchar(max) = @WantedTableName,
@vTableNameInCsv varchar(max) = @CsvTableName,
@vDoCreateTable varchar(max) = '';
if ((select OBJECT_ID('ShadowMapTable')) > 0 )
begin
drop table ShadowMapTable;
end;
select * into ShadowMapTable from mapTable;
select t1.name
from sys.columns t1
join sys.tables t2 on (t1.object_id = t2.object_id)
join ShadowMapTable t3 on (t1.name = t3.inCsv)
where t2.name = @vTableNameInCsv;
set @vColumns = @@rowcount;
WHILE (@vColumns > 0)
begin
select @vColumnName = t1.name, @vColumnNameRenamed = t1.name + ' as ' + t3.inSql
from sys.columns t1
join sys.tables t2 on (t1.object_id = t2.object_id)
join ShadowMapTable t3 on (t1.name = t3.inCsv)
where t2.name = @vTableNameInCsv
-- Define the ColumnListRenamed -> used in the into clause.
if (@vColumnList = '')
begin
set @vColumnList = @vColumnNameRenamed
end else
begin
set @vColumnList = @vColumnNameRenamed + ',' + @vColumnList;
end;
delete from ShadowMapTable
where inCsv = @vColumnName
select t1.name, t3.inCsv, t3.inSql
from sys.columns t1
join sys.tables t2 on (t1.object_id = t2.object_id)
join ShadowMapTable t3 on (t1.name = t3.inCsv )
where t2.name = @vTableNameInCsv
set @vColumns = @@rowcount;
end;
set @vDoCreateTable = '
if((select object_id('''+@vTableNameInSql+''')) > 0)
begin
drop table '+@vTableNameInSql+';
end;
select ' + @vColumnList + ' into ' + @vTableNameInSql + ' from ' + @vTableNameInCsv + ';';
--print @vDoCreateTable;
exec (@vDoCreateTable);
exec ('select * from ' + @vTableNameInSql);
print ('Table created: ' + @vTableNameInSql);
最后,应该如何调用 Proc。
exec CREATE_TABLE_FROM_CSV 'csvImported', 'wantedTableName';
我真的希望它有所帮助。
亲切的问候,
维克多。