2017-04-05 19 views
0

아래 스크립트를 실행하면 데이터를 테이블에 삽입 할 수 있습니다.SQL의 플랫 파일에서 대량 삽입 할 수 없습니다.

CREATE PROCEDURE dbo.loadDataFrFlatFile 

AS 
BEGIN 


BULK INSERT PERSONS 
FROM 'C:\SampleData1.csv' 
WITH (FieldTerminator = '|', RowTerminator = '\n') 
END 

RETURN 1 

GO 

EXEC dbo.loadDataFrFlatFile 

그러나 파일 경로를 입력 변수로 입력하면 작동하지 않습니다.

CREATE PROCEDURE dbo.loadDataFrFlatFile 
(
    @flatFilePath varchar(255) 
) 

AS 
BEGIN  

BULK INSERT PERSONS 
FROM ' + @flatFilePath + ' 
WITH (FieldTerminator = '|', RowTerminator = '\n') 
END 

RETURN 1 

GO 

EXEC dbo.loadDataFrFlatFile @flatFilePath = 'C:\SampleData1.csv' 

표시되는 오류는 다음과 같습니다

Msg 4860, Level 16, State 1, Procedure loadDataFrFlatFile, Line 12 
Cannot bulk load. The file " + @flatFilePath + " does not exist. 

이 도와주세요. 미리 감사드립니다.

답변

1

당신은

create procedure dbo.loadDataFrFlatFile (@flatFilePath varchar(255)) as 
begin; 
declare @sql nvarchar(max) = 'bulk insert persons 
from ''' + @flatFilePath + ''' 
with (FieldTerminator = ''|'', RowTerminator = ''\n'') 
'; 
exec sp_executesql @sql; 
return 1 
end; 
go 

exec dbo.loadDataFrFlatFile @flatFilePath = 'C:\SampleData1.csv' 

이에 대한 SQL 주입에주의 :, 그것을 위해 예컨대을 동적 SQL을 사용할 필요가 있는지 확인 만 실행할 수있는 권한이 그것을 사용하기 위해 필요로하는 사람들.

또한 변수를 연결하고 실행하기 전에 변수에 포함 할 수있는 값을 화이트리스트로 나열하고 블랙리스트에 올릴 수 있습니다.

동적 SQL 참조 :