我遇到了BULK INSERT的问题,情况如下:我有一个文件夹路径,其中可能有200个文件,但我有一个包含400个文件名的表,我必须检查它们是否存在于相同的文件夹路径中。我需要BULK INSERT来搜索这400个文件名,如果它没有找到一个文件名,因为它不存在,然后继续下一个文件,但是当文件名不存在于文件夹中时,我的代码实际上停止了,并且它没有继续尝试加载下一个文件名。
现在正在查找第一个文件所以while循环会一直运行到最后然后它会从表中删除该文件名以继续查找第二个文件但是当它找不到下一个文件名时,它会退出while循环,不从表中删除文件名而只插入找到的第一个文件当我们仍然缺少398个文件要搜索并加载
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
我只对EXEC变量应用了BEGIN TRY,现在它遍历现有的400个文件名中的每一个,如果没有找到1,则转到下一个文件。如果最后只找到400个中的100个,这100个的数据将被加载到表中。
一旦脚本被执行,它将显示所有未找到的文件的错误,但它将加载找到的文件:)
;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