代码之家  ›  专栏  ›  技术社区  ›  Dr. Rajesh Rolen

使用存储过程进行大容量插入

  •  29
  • Dr. Rajesh Rolen  · 技术社区  · 14 年前

    我有一个很好的问题:

    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
    

    但它显示出错误:

    InsertZipCode,第6行语法不正确 在“@filepath”附近。

    消息319,级别15,状态1,过程 在关键字“with”附近。如果这个 语句是公共表 变更跟踪上下文子句 上一个语句必须终止 用分号。

    请告诉我我做错了什么,我可以做些什么使它在存储过程中工作。

    4 回复  |  直到 14 年前
        1
  •  41
  •   marc_s HarisH Sharma    14 年前

    您的存储过程代码没有任何问题-重点是: BULK INSERT

    这确实有效:

    BULK INSERT ZIPCodes 
    FROM  'e:\5-digit Commercial.csv' 
    WITH 
    

    但无论是否在存储过程中,这都不起作用:

    DECLARE @filename VARCHAR(255)
    SET @filename = 'e:\5-digit Commercial.csv' 
    
    BULK INSERT ZIPCodes 
    FROM @filename
    WITH 
    

    不幸的是,你不能这样做。你可以考虑建立你的 批量插入

    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
  •  0
  •   Bo Persson tox    12 年前

    你只要试试,我想你需要把这个CSV文件直接上传到“E”驱动器。为此,你需要有管理权限,我想,或问谁在数据库管理。

    create procedure dbo.InsertZipCode
    AS
    BEGIN
    SET NOCOUNT ON;
     BULK
       INSERT ZIPCodes from 'e:\5-digit Commercial.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '\n'
    )
    END
    
        3
  •  0
  •   Ed Ajaz    6 年前

    如果您有权访问SQLCmd exe,则可以选择动态SQL。

    SqlCmd实用程序允许您使用-v参数传递字符串替换变量。

    可以使用名为“filepath”的模板变量,该变量将在通过命令行执行脚本时被替换。

    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
  •  -1
  •   finefoot    6 年前
    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;