Создание таблицы с теми же столбцами, что и в CSV - PullRequest
2 голосов
/ 03 декабря 2010

Я пишу stored procedure, который должен взять данные из файла csv и insert в table.Моя проблема в том, что число columns в файле csv не является фиксированным (т.е. число columns является переменным).Поэтому мне нужен какой-то способ создать temporary table с точно таким же числом columns, что и в файле csv.Так что я могу использовать bulk insert.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2014

улучшен скрипт nadeems ... чуть более надежный.

Этот код отлично подходит для загрузки нескольких файлов CSV без использования мастеров по умолчанию.

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE proc [dbo].[importeer_csv_as_table]
@path nvarchar(255),
@new_table_name varchar(255), 
@field_terminator varchar(255),
@row_terminator varchar(255)
as
begin
declare @execsql nvarchar(max)
declare @tempstr varchar(max)
declare @col varchar(max)
declare @table nvarchar(max)
declare @drop_table varchar(max)


-- 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 =''' + @row_terminator + ''',
                 firstrow = 1,  
                 rowterminator = ''' + @row_terminator + ''',
                 lastrow = 1 
              )         
       ' 

   exec sp_executesql @stmt=@execsql 


   --replace field terminator with comma
   update #tbl set line = replace(line, @field_terminator, ',')

   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(max),'     

       set @tempstr = substring(@tempstr, charindex(',',@tempstr)+1, len(@tempstr)) 
    end
    set @col = @col + '[' + @tempstr + '] varchar(max)'

   if object_id(@new_table_name) is not null
   begin
      set @drop_table = 'drop table [' + @new_table_name + ']'

      exec sp_executesql @stmt= @drop_table
   end 

   set @table = 'create table [' + @new_table_name + '] (' + @col + ')'

   --select @table


   exec sp_executesql @stmt=@table

   --Load data from csvle
   set @execsql = 
        'bulk insert [' + @new_table_name + ']
        from ''' + @path + '''  
        with (  
                 fieldterminator =''' + @field_terminator + ''',
                 firstrow = 2,  
                 rowterminator = ''' + @row_terminator + '''              
              )         
       '  

   exec sp_executesql @stmt=@execsql 

end

GO
1 голос
/ 06 декабря 2010

Ну, я попытался решить проблему, написав 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
1 голос
/ 03 декабря 2010

Вы можете использовать Powershell для обработки файла CSV, здесь есть пример здесь , который вы, вероятно, можете адаптировать для учета переменного числа полей.Вы можете создать SQL для создания таблицы, а затем выполнить массовую загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...