-- COPYRIGHT ©2018 - SQL CODE MONKEY -- -- www.sqlcodemonkey.com -- -- Steven Tidwell -- -- DECLARE SOME VARIABLES -- DECLARE @Loop INT, -- NUMBER OF FILES WE WILL BE IMPORTING @Count INT = 1, -- DEFAULT OF 1 - THAT WAY WE ALWAYS START AT 1 @TableName VARCHAR(15), -- THIS WILL HOLD THE NAME OF THE TABLE -- YOU CAN EXPAND THE SIZE @FileName VARCHAR(15), -- THIS IS THE FILE NAME THAT WE WILL BE READING FROM THE DIRECTORY @DynamicSQL NVARCHAR(MAX) -- THIS WILL HOLD THE SQL CODE THAT WILL DO ALL THE HEAVY LIFTING -- STEP 1: SCAN THE DIRECTORY AND FIND A LIST OF CSV FILES -- -- CREATE A TEMP TABLE TO HOLD THE FILE NAMES -- IF OBJECT_ID('tempdb.dbo.#Files') IS NOT NULL BEGIN DROP TABLE #Files END CREATE TABLE #Files ( FileID INT IDENTITY(1,1) NOT NULL, fName NVARCHAR(100), Depts INT, F1 INT ) -- NOW WE WILL MAKE A DUPLICATE OF THE ABOVE TABLE IN ORDER TO CLEAN THE FILES AND CREATE THE TABLE NAMES -- IF OBJECT_ID('tempdb.dbo.#CleanFiles') IS NOT NULL BEGIN DROP TABLE #CleanFiles END CREATE TABLE #CleanFiles ( FileID INT IDENTITY(1,1) NOT NULL, TableName NVARCHAR(100), fName NVARCHAR(100) ) -- NOW WE WILL LOOK IN THE DIRECTORY AND GRAB ANY FILES THAT ARE IN THE DIRECTORY -- INSERT INTO #Files (fName, Depts, F1) EXEC master.dbo.xp_DirTree 'H:\DataFilesToUpload',1,1 -- NOW THAT WE HAVE THE FILES IN a TEMP TABLE -- WE CAN STRIP OUT THE NON CSV FILES AND PUSH THEM INTO THE CLEANFILE TABLE -- INSERT INTO #CleanFiles (TableName, fName) SELECT LEFT(fName,CHARINDEX('.',fName)-1), fName FROM #Files WHERE fName LIKE ('%.csv') SET @Loop = @@ROWCOUNT -- STEP 2: RUN A LOOP AND IMPORT THE FILES INTO A TEMP TABLE -- WHILE @Loop > 0 AND @Count <= @Loop BEGIN -- WE WILL SET THE @TableName & @FileName VARIABLES -- SELECT @TableName = cf.TableName, @FileName = cf.fName FROM #CleanFiles cf WHERE cf.FileID = @Count -- NOW WE WILL START ADDING THE CODE TO DYNAMIC SQL IN ORDER TO PROCESS THE FILES -- SET @DynamicSQL = N' -- WE WILL CREATE A TEMP TABLE TO HOLD THE DATA IN EACH FILE -- IF OBJECT_ID(''tempdb.dbo.#' + @TableName + ''') IS NOT NULL BEGIN DROP TABLE #' + @TableName + ' END -- NOW WE WILL CREATE THE TEMP TABLE TO HOLD THE DATA -- -- (YOU SHOULD ALREADY KNOW THE STRUCTURE OF THE DATA SO YOU CAN BUILD THE TABLE TO MATCH THE CSV FILE) -- CREATE TABLE #' + @TableName +' -- YOU CAN CREATE THIS AS A GLOBAL TEMP TABLE IF YOU WOULD LIKE TO DO THE REST OF THE DATA MANIPULATION IN SQL -- ( StockItemName NVARCHAR(200), UnitPrice MONEY, OnHand INT, OrderAmt INT ) -- NOW WE WILL LOAD THE DATA INTO THE TEMP TABLE -- BULK INSERT #' + @TableName + ' -- USING DYNAMIC SQL WILL ALLOW US TO LOOP FOR EACH FILE IN OUR TABLE -- FROM ''H:\DataFilesToUpload\' + @FileName + ''' WITH (FORMATFILE = ''H:\DataFilesToUpload\InvFormat.xml'') -- NOW THE DATA FROM THE CSV FILE HAS BEEN LOADED INTO A TEMP TABLE -- -- WE WILL NOW CHECK TO SEE IF THERE IS A PERMANENT TABLE WITH THE SAME NAME ALREADY BUILT -- IF NOT WE WILL BUILD IF - IF NOT EXISTS(SELECT 1 FROM sys.Tables WHERE [Name] = ''' + @TableName + ''') BEGIN CREATE TABLE ' + @TableName + ' ( StockItemName NVARCHAR(200), UnitPrice MONEY, OnHand INT, OrderAmt INT, DateAdded SMALLDATETIME ) -- NOW THAT THE PERMANENT TABLE HAS BEEN BUILT - WE WILL INSERT INTO IT -- INSERT INTO ' + @TableName + ' (StockItemName, UnitPrice, OnHand, OrderAmt, DateAdded) SELECT StockItemName, UnitPrice, OnHand, OrderAmt, GETDATE() FROM #' + @tableName + ' END ' EXEC sp_ExecuteSQL @DynamicSQL --PRINT @DynamicSQL SET @Count = @Count + 1 END