Friday, February 3, 2012

Import CSV into sql server with Bulk insert

*****************************************************************************************************************************/
CREATE PROCEDURE [dbo].[DynamicImportCSV]
@FileName VARCHAR(200), @delimiter VARCHAR(2),@schema VARCHAR(20)='dbo',@tableName VARCHAR(100)
AS
BEGIN
--DECLARE @FileName varchar(100)
--SET @FileName = 'C:\3M Domestic.tsv'

DECLARE @importSqlQuery varchar(4000)
DECLARE @oFSO int, @oTSO int, @line varchar(4000)
-- get the first line from the file
IF (@FileName IS NULL)
BEGIN
PRINT 'There is no file name is specified. Process wont be continued.'
RETURN
END
ELSE IF (@delimiter IS NULL)
BEGIN
PRINT 'Delimiter Input is empty . Process wont be continued.'
RETURN
END


--DROP TABLE
--EXEC('drop table ' + @schema + '.' + @tableName)

SET @delimiter = RTRIM(LTRIM(@delimiter))
--PRINT @delimiter
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @oFSO OUTPUT
EXECUTE sp_OAMethod @oFSO, 'OpenTextFile', @oTSO OUTPUT, @FileName
EXECUTE sp_OAMethod @oTSO, 'ReadLine', @line OUTPUT
EXECUTE sp_OAMethod @oTSO, 'Close'
EXECUTE sp_OADestroy @oTSO
EXECUTE sp_OADestroy @oFSO

IF (@delimiter = '\t')
SET @delimiter = CHAR(9)
ELSE IF (@delimiter = '\t\0')
SET @delimiter = '\t\0'

SET @line = REPLACE (@line, @delimiter, '] NVARCHAR(MAX),[')


SET @line = 'CREATE TABLE '+ @schema + '.' + @tableName +' ([' + @line + '] NVARCHAR(MAX))'
--PRINT @line
EXEC (@line)

--Import CSV data to DynamicImport Table
SET @importSqlQuery =
'BULK INSERT '+ @schema + '.' + @tableName +'
FROM ''' + @FileName + '''
WITH
(
FIRSTROW = 2,
MAXERRORS = 0,
FIELDTERMINATOR = '''+@delimiter +''',
ROWTERMINATOR = ''\n'',
DATAFILETYPE=''widechar'' ,
CODEPAGE=1252
)'
--PRINT @importSqlQuery
EXEC (@importSqlQuery)
END