Ну, я попытался решить проблему, написав sp, который возьмет путь к файлу csv в качестве параметра и создаст имена таблиц с такими же параметрами, как и для числа столбцов в csv. CSV-файл выглядит как
eid,ename,esalary,etemp
1,Mark,1000,
2,Peter,1000,
Сохраненный скрипт Proc
create proc createtable
@path nvarchar(50)
as
begin
declare @execSQL nvarchar(1000)
declare @tempstr varchar(1000)
declare @col varchar(1000)
declare @table nvarchar(1000)
-- Create a temp table to with one column to hold the first row of the csv file
CREATE TABLE #tbl (line VARCHAR(1000))
SET @execSQL =
'BULK INSERT #tbl
FROM ''' + @path + '''
WITH (
FIELDTERMINATOR =''\n'',
FIRSTROW = 1,
ROWTERMINATOR = ''\n'',
LASTROW = 1
)
'
EXEC sp_executesql @stmt=@execSQL
SET @col = ''
SET @tempstr = (SELECT TOP 1 RTRIM(REPLACE(Line, CHAR(9), ',')) FROM #tbl)
DROP TABLE #tbl
WHILE CHARINDEX(',',@tempstr) > 0
BEGIN
SET @col=@col + LTRIM(RTRIM(SUBSTRING(@tempstr, 1, CHARINDEX(',',@tempstr)-1))) + ' varchar(100),'
SET @tempstr = SUBSTRING(@tempstr, CHARINDEX(',',@tempstr)+1, len(@tempstr))
END
SET @col = @col + @tempstr + ' varchar(100)'
if object_id('temptable') is not null
drop table temptable
SET @table = 'create table temptable (' + @col + ')'
EXEC sp_executesql @stmt=@table
-- Load data from csv
SET @execSQL =
'BULK INSERT temptable
FROM ''' + @path + '''
WITH (
FIELDTERMINATOR ='','',
FIRSTROW = 2,
ROWTERMINATOR = ''\n''
)
'
EXEC sp_executesql @stmt=@execSQL
end