SQL批量插入循环

时间:2018-02-01 14:09:26

标签: sql sql-server

我尝试在循环中运行BULK INSERT。循环遍历某些目录中的每个文件,而不是特定文件。以下是我的解决方案

DECLARE @startFlag INT
DECLARE @endFlag INT
DECLARE @fileName varchar(50)
SET @startFlag = 1
SET @endFlag = 10
WHILE (@startFlag <= @endFlag)
BEGIN
    SET @fileName = 'c:\path to file\filename_' + cast(@startFlag as varchar) + '.csv'
    BULK
    INSERT dbo.Intraday
    FROM @fileName
    WITH
    (
    FIELDTERMINATOR = '|',
    ROWTERMINATOR = '\n'
    )
    SET @startFlag = @startFlag + 1
END
GO

但似乎没有工作。有什么我可以忽略的或其他缺失的东西我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您不能在TSQL中使用您可能喜欢的所有位置的变量或表达式。您将不得不使用动态SQL:

declare @fileName nvarchar(2000) = 'foo.csv'
SET @fileName = 'foo'
declare @sql nvarchar(max) = N'
BULK
INSERT dbo.Intraday
FROM '''+@fileName+'''
WITH
(
FIELDTERMINATOR = ''|'',
ROWTERMINATOR = ''\n''
)';

exec (@sql);

答案 1 :(得分:0)

你不能在From之后使用名副​​其实的名字。你必须在from子句之后提供文件名而不是变量。所以你需要动态地制作完整的批量插入语句。请参考下面的示例代码 -

declare @sql nvarchar(max)    
DECLARE @fileName varchar(50)
set @fileName ='C:\Input.txt' 

set  @sql = 'BULK
    INSERT dbo.Intraday
    FROM ''' + @fileName + '''
    WITH
    (
    FIELDTERMINATOR = ''|'',
    ROWTERMINATOR = ''\n''
    )'

exec(@sql)