[SQL] 저장 프로 시저를 사용하여 대량 삽입
SQL저장 프로 시저를 사용하여 대량 삽입
나는 잘 작동하는 쿼리를 가지고 :
BULK INSERT ZIPCodes
FROM 'e:\5-digit Commercial.csv'
WITH
(
FIRSTROW = 2 ,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
하지만 지금은 그것을 위해 저장 프로 시저를 만들려고합니다.
나는 그것의 저장 프로 시저를 만들기 위해 코드를 아래에 작성했습니다 :
create proc dbo.InsertZipCode
@filepath varchar(500)='e:\5-digit Commercial.csv'
as
begin
BULK INSERT ZIPCodes
FROM @filepath
WITH
(
FIRSTROW = 2 ,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
end
하지만 보여주는 오류 :
내가 잘못을하고있는 중이 야 무엇을 말해 나는 그것을 저장 프로 시저에서 일하기 위해 무엇을 할 수 있는지하시기 바랍니다.
감사
해결법
-
==============================
1.저장 프로 시저 코드와 아무것도 잘못이있다 - 포인트입니다 : 벌크 INSERT 명령은 변수로 파일 이름을 받아 들일 수 없습니다.
저장 프로 시저 코드와 아무것도 잘못이있다 - 포인트입니다 : 벌크 INSERT 명령은 변수로 파일 이름을 받아 들일 수 없습니다.
이 작업을 수행합니다 :
BULK INSERT ZIPCodes FROM 'e:\5-digit Commercial.csv' WITH
그러나 이것은 결코 작동하지 않습니다 - proc 디렉토리에 저장 여부 이내 :
DECLARE @filename VARCHAR(255) SET @filename = 'e:\5-digit Commercial.csv' BULK INSERT ZIPCodes FROM @filename WITH
당신은 불행하게도, 이런 식으로하지 않을 수 있습니다. 당신은 (고정 된 파일 이름) 문자열로 BULK INSERT 문을 구축을 고려하고 동적 SQL로 실행할 수 있습니다 -하지만 난 정말 다른 어떤 솔루션을 볼 수 없습니다.
DECLARE @filepath nvarchar(500) SET @filepath = N'e:\5-digit Commercial.csv' DECLARE @bulkinsert NVARCHAR(2000) SET @bulkinsert = N'BULK INSERT ZIPCodes FROM ''' + @filepath + N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')' EXEC sp_executesql @bulkinsert
-
==============================
2.당신은 단지 그것을 밖으로 시도, 난 당신이 'E'드라이브에 직접 CSV 파일을 업로드 할 필요가 있다고 생각합니다. 당신은 내 생각, 관리자 권한, 또는 데이터베이스 관리에서 사람을 물어 필요.
당신은 단지 그것을 밖으로 시도, 난 당신이 'E'드라이브에 직접 CSV 파일을 업로드 할 필요가 있다고 생각합니다. 당신은 내 생각, 관리자 권한, 또는 데이터베이스 관리에서 사람을 물어 필요.
create procedure dbo.InsertZipCode AS BEGIN SET NOCOUNT ON; BULK INSERT ZIPCodes from 'e:\5-digit Commercial.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) END
-
==============================
3.당신이 SQLCMD exe 인에 액세스 할 수있는 경우 동적 SQL에 대한 대안이있다.
당신이 SQLCMD exe 인에 액세스 할 수있는 경우 동적 SQL에 대한 대안이있다.
함께 SQLCMD 유틸리티를 사용하면 -v 인수를 사용하여 문자열 대체 변수를 전달할 수 있습니다.
당신은 당신이있는 CmdLine를 통해 스크립트를 실행할 때 대체 될 것이다 "파일 경로"라는 이름의 템플릿 변수를 사용할 수 있습니다.
SQL 스크립트는 같을 것이다 :
BULK INSERT ZIPCodes FROM '$(filepath)' WITH ( FIRSTROW = 2 , FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) end
그런 다음 다음과 같은 것을 사용하여 명령 줄에서 스크립트를 실행합니다 :
sqlcmd -b -S SERVER\INSTANCEHERE -E -i "PATH\FILENAMEHERE.Sql" -v FilePath = "e:\5-digit Commercial.csv" -s "|"
예제의 중요한 부분은 -v 인수입니다 :
-v FilePath = "e:\5-digit Commercial.csv"
-
==============================
4.
create PROC TestInsert ( @stuName NVARCHAR(50) , @XmlData XML ) AS BEGIN BEGIN TRY INSERT INTO dbo.Test_Student ( stuName ) VALUES ( @stuName ); DECLARE @id BIGINT; SET @id = ( SELECT SCOPE_IDENTITY() ); INSERT INTO dbo.Test_Qual ( stuid , stuclass , InstituteId , obtmark , totalmark , per ) SELECT @id , col.value('stuclass[1]', 'nvarchar(50)') AS stuclass , col.value('InstituteId[1]', 'int') AS InstituteId , col.value('obtmark[1]', 'nvarchar(100)') AS obtmark , col.value('totalmark[1]', 'nvarchar(50)') AS totalmark , col.value('per[1]', 'nvarchar(50)') AS per FROM @XmlData.nodes('Parent/child') AS Doc ( col ); SELECT @id AS RegisIdNUH , 1 AS Flag , 'Save' AS Msg FROM dbo.Test_Student R WHERE R.stuid = @id; END TRY BEGIN CATCH SELECT 0 AS Flag , 'Some Error occur' AS Msg; ROLLBACK; END CATCH; END;
from https://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열 등 여러 행을 가입 MYSQL (0) | 2020.05.22 |
---|---|
[SQL] T-SQL 건너 뛰기는 저장 프로 시저를 가지고 가십시오 (0) | 2020.05.22 |
[SQL] SQL : 어떻게 하나의 열에서 여러 기준을 충족하는 하나의 아이디 ( "행")를 선택합니다 (0) | 2020.05.22 |
[SQL] SQL의 행에 널 열 카운트 (0) | 2020.05.22 |
[SQL] 어떻게 MySQL의에서 JSON 데이터를 검색하려면? (0) | 2020.05.22 |