I’m having an issue with BULK INSERT , the situation is the following : I’ve a folder path with probably 200 files in it but I’ve a table with 400 filenames that I must review if they exist in the same folder path. I need the BULK INSERT to search for this 400 filenames and if It does not find one filename because it does not exist , then move on with the next file but my code is actually stopping when the filename does not exists in the folder and it does not keep trying to load next filename.
Right now, is finding the 1st file so the while loop works till the end and then it deletes that filename from the table to continue with the second file but when it does not find the next file name , it goes out of the while loop, not deleting the filename from the table and just inserting the 1st file found when we are still missing 398 more files to search and load if found
BEGIN TRY
;WHILE (SELECT COUNT(*)
FROM dbo.IBOFileNames_V1) > 0
BEGIN
SET @FileName = ''
SET @FileName = (SELECT TOP 1 FileName
FROM dbo.IBOFileNames_V1
ORDER BY [Date] ASC)
SET @SQLScript = N'
BULK INSERT [dbo].[RawEventBCPIBO_V1]
FROM ''' + @MainPath + @FolderPath + N'' + @FileName + N''''
IF @FileType = 'TXT'
BEGIN
SET @SQLScript = @SQLScript + N'
WITH
(
FIRSTROW=1,
FIELDTERMINATOR=''t'',
ROWTERMINATOR=''n''
) '
END
ELSE
BEGIN
SET @SQLScript = @SQLScript + N'
WITH
(
FORMAT=''CSV'',
FIRSTROW=1,
KEEPNULLS,
FIELDTERMINATOR='','',
ROWTERMINATOR=''n''
) '
END
EXEC sp_executesql @SQLScript
DELETE FROM dbo.IBOFileNames_V1
WHERE FileName = @FileName
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END;
DECLARE @errorSeverity INT = ERROR_SEVERITY();
DECLARE @errorState INT = ERROR_STATE();
DECLARE @logMessage VARCHAR(MAX);
SET @logMessage = 'Line ' + CONVERT(NVARCHAR, ERROR_LINE()) + ': ' + ERROR_MESSAGE();
RAISERROR(@logMessage, @errorSeverity, @errorState);
END CATCH
Advertisement
Answer
I’ve applied the BEGIN TRY just to the EXEC variable , now it goes trough each of the existing 400 filenames, if it does not find 1 then it goes to the next file . If at the end only found 100 of the 400, the data of those 100 will be loaded into the table.
Once the script gets executed, it will show the error for all the files that were not found but it will load the ones found 🙂
;WHILE (SELECT COUNT(*)
FROM dbo.IBOFileNames_V1) > 0
BEGIN
SET @FileName = ''
SET @FileName = (SELECT TOP 1 FileName
FROM dbo.IBOFileNames_V1
ORDER BY [Date] ASC)
SET @SQLScript = N'
BULK INSERT [dbo].[RawEventBCPIBO_V1]
FROM ''' + @MainPath + @FolderPath + N'' + @FileName + N''''
IF @FileType = 'TXT'
BEGIN
SET @SQLScript = @SQLScript + N'
WITH
(
FIRSTROW=1,
FIELDTERMINATOR=''t'',
ROWTERMINATOR=''n''
) '
END
ELSE
BEGIN
SET @SQLScript = @SQLScript + N'
WITH
(
FORMAT=''CSV'',
FIRSTROW=1,
KEEPNULLS,
FIELDTERMINATOR='','',
ROWTERMINATOR=''n''
) '
END
BEGIN TRY
EXEC sp_executesql @SQLScript
END TRY
BEGIN CATCH
PRINT 'Error File - ' + @SQLScript;
END CATCH
DELETE FROM dbo.IBOFileNames_V1
WHERE FileName = @FileName
END