动态SQL实现BULK INSERT时语法报错的原因排查
问题原因与解决方法
你的错误源于SQL语句拼接时缺少空格:BULK INSERT指定的表名MMBL_phase2.dbo.auto_test和FROM关键字被直接连在了一起,生成的无效SQL类似BULK INSERT MMBL_phase2.dbo.auto_testFROM 'D:\...',这就触发了语法错误。
修正后的代码
只需要在表名末尾或FROM开头添加一个空格即可:
DECLARE @sql VARCHAR(MAX); DECLARE @fileDate VARCHAR(100); DECLARE @filePath VARCHAR(100); SET @fileDate = CAST(GETDATE() AS date); SET @filePath = 'D:\BI-SCRIPTS\Nauman\test.csv'; SET @sql = N'BULK INSERT MMBL_phase2.dbo.auto_test ' + 'FROM ''' + @filePath + '''' + ' WITH( FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''0x0a'' );' EXEC (@sql);
更安全的写法(避免SQL注入)
如果文件名是外部传入的参数,建议使用sp_executesql进行参数化查询,比直接字符串拼接更安全:
DECLARE @sql NVARCHAR(MAX); DECLARE @filePath NVARCHAR(100) = 'D:\BI-SCRIPTS\Nauman\test.csv'; SET @sql = N'BULK INSERT MMBL_phase2.dbo.auto_test FROM @FilePath WITH( FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''0x0a'' );'; EXEC sp_executesql @sql, N'@FilePath NVARCHAR(100)', @FilePath = @filePath;
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

