Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止动态SQL for bulk insert中的SQL注入?_Sql_Sql Server_Sql Injection_Bulkinsert_Bulk - Fatal编程技术网

如何防止动态SQL for bulk insert中的SQL注入?

如何防止动态SQL for bulk insert中的SQL注入?,sql,sql-server,sql-injection,bulkinsert,bulk,Sql,Sql Server,Sql Injection,Bulkinsert,Bulk,我使用动态SQL进行批量插入,并带有一个参数() 但是。。。如何避免SQL注入?一种方法是检索文件名,而不是传入。。。差不多 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) ,

我使用动态SQL进行批量插入,并带有一个参数()


但是。。。如何避免SQL注入?

一种方法是检索文件名,而不是传入。。。差不多

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

然后,在#文件名中将是该目录中的所有文件(其中当然是isfile=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

然后,在#文件名中将是该目录中的所有文件(其中当然是isfile=1)。然后,您只需从临时表中查询文件名。

您可以使用
QUOTENAME
将文件名用单引号括起来:

DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ' + QUOTENAME(@FileName,'''') + ' WITH ( FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'' )';
EXEC (@sql);

您可以使用
QUOTENAME
将文件名用单引号括起来:

DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ' + QUOTENAME(@FileName,'''') + ' WITH ( FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'' )';
EXEC (@sql);

看看sp_executesql@Leonidas199x-sp_executesql与参数一起工作,大容量插入不支持'FROM'子句中的参数。我不知道这一点。看看sp_executesql@Leonidas199x-sp_executesql与参数一起工作,而大容量插入不支持'FROM'子句中的参数。我不知道这一点。