我尝试在循环中运行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
但似乎没有工作。有什么我可以忽略的或其他缺失的东西我可以解决这个问题吗?
答案 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)