【问题标题】:Unable to bulk insert from flat file in SQL无法从 SQL 中的平面文件批量插入
【发布时间】:2017-04-05 21:06:33
【问题描述】:

如果我执行下面的脚本,数据可以插入到表中。

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.

请帮忙。提前致谢。

【问题讨论】:

    标签: sql-server bulkinsert flat-file


    【解决方案1】:

    您需要为此使用动态 sql,例如:

    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参考:

    【讨论】:

      【解决方案2】:

      来自https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql

      试试类似的东西

      DECLARE @bulk_cmd varchar(1000);  
      SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
      FROM ''<drive>:\<path>\<filename>''   
      WITH (ROWTERMINATOR = '''+CHAR(10)+''')';  
      EXEC(@bulk_cmd);  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多