복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  5. from https://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure by cc-by-sa and MIT license