I am trying to automate the process of bulk import of CSV files to sql server, so far I have this:
SET NOCOUNT ON
CREATE TABLE
CREATE TABLE
INSERT INTO
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"';
DECLARE @fileName varchar(100)
DECLARE @tableName varchar(MAX)
DECLARE @sql varchar(MAX)
While (Select Count(*) From
Begin
Select Top 1 @fileName = excelFileName From
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSide\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
EXEC (@sql)
UPDATE #tmpCol SET col = REPLACE(col, '"', '')
UPDATE #tmpCol SET col = REPLACE(col, ' ', '')
SET @tableName = LEFT(@filename, LEN(@filename) -4)
CREATE TABLE @tableNAme ( )
Delete from #tmp Where excelFileName = @FileName
End
DROP TABLE #tmp
DROP TABLE #tmpCol
Bulk insert @sqlgets column headers as needed, but I can't figure out how to pass this into the statement CREATE TABLE.
Any help would be greatly appreciated!
----- EDIT ----------------------------------------- --- -------
After changing the CREATE TABLE to use dynamic SQL, I end up with the following (I also put it in a loop):
SET NOCOUNT ON
CREATE TABLE
CREATE TABLE
INSERT INTO
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"';
DECLARE @fileName varchar(100)
DECLARE @tableName varchar(MAX)
DECLARE @colName varchar(MAX)
DECLARE @sql varchar(MAX)
DECLARE @sql2 varchar(max)
While (Select Count(*) From
Begin
Select Top 1 @fileName = excelFileName From
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
EXEC (@sql)
UPDATE #tmpCol SET col = REPLACE(col, '"', '')
UPDATE #tmpCol SET col = REPLACE(col, ' ', '')
WHILE (SELECT COUNT(*) FROM #tmpCol WHERE col IS NOT NULL) > 0
BEGIN
Select Top 1 @colName = col From #tmpCol
SET @tableName = LEFT(@filename, LEN(@filename) - 5)
SET @sql2 = 'CREATE TABLE [' + @tableName + ']('
SELECT @sql2 = @sql2 + '[' + col + '],' FROM #tmpCol
SET @sql2 = SUBSTRING(@sql2,1,LEN(@sql2) -1) + 'NVARCHAR(MAX)) '
EXEC(@sql2)
DELETE FROM #tmpCol WHERE col = @colName
END
Delete from #tmp Where excelFileName = @FileName
End
DROP TABLE #tmp
DROP TABLE #tmpCol
The problem is that this is the first Dynamic SQL query:
SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)'
Since the last row is set to 1, and rowterminator is ",", it only picks up one column. If I changed RowTerminator to "\ n", it puts everything on one line, for example:
"Attachment Id","Attachment Owner Id","Modified By","Created By","Created Time","Modified Time","File Name",Size,"Parent Id","Attachment Type",Documents
LASTROW = '\n'?