我使用动态SQL进行带参数(Bulk insert using stored procedure)的批量插入。
DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ''' + @FileName + ''' WITH ( FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'' )';
EXEC(@sql);
但是......如何避免SQL注入?
答案 0 :(得分:1)
一种方法是检索文件名,而不是传递给它......比如
DECLARE @fileLocation VARCHAR(128) = '\\some\folder\location'
IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames
CREATE TABLE #FileNames(
id int IDENTITY(1,1)
,subdirectory nvarchar(512)
,depth int
,isfile bit)
INSERT #FileNames(subdirectory,depth,isfile)
EXEC xp_dirtree @fileLocation, 1, 1
然后,在#FileNames中将是该目录中的所有文件(当然isfile = 1)。然后,您只需从临时表中查询文件名即可。
答案 1 :(得分:1)
您可以使用QUOTENAME
用单引号括起文件名:
DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ' + QUOTENAME(@FileName,'''') + ' WITH ( FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'' )';
EXEC (@sql);