批量插入失败为动态sql

时间:2013-08-09 12:56:51

标签: sql-server bulkinsert sp-executesql

我在SP中设置了一个批量插入的代码:

begin try

    declare @sentFile nvarchar(255)
    declare @bulk_cmd nvarchar(1000) = ''
    declare @loadDate nvarchar(8) = Convert(nvarchar(8),@p_loadDate) -- @p_loadDate is char(8)

    set @StrImportFolder = N'D:\EMVImports\'
    set @sentFile = @StrImportFolder + N'etl_rnli_sent_'+ @loadDate + N'.txt'

    SET @bulk_cmd = N'BULK INSERT loadSent
                 FROM ''' + @sentFile + N'''
                 WITH (
                     FIRSTROW = 2
                     ,formatfile=''D:\EMVScripts\Sent_Format.xml'' 
                 )'
    Print @bulk_cmd
    EXECUTE sp_executesql @bulk_cmd

    --  more stuff happens here
end try

在我的存储过程中,此操作失败并出现此错误:

  

无法从OLE DB提供程序“BULK”获取链接服务器“(null)”的行。

但是代码打印出来了:

BULK INSERT loadSent    
FROM 'D:\EMVImports\etl_sent_20130529.txt'    
WITH (      
    FIRSTROW = 2      
    ,formatfile='D:\EMVScripts\Sent_Format.xml'      
)

就像一个魅力。我不知道为什么它在sp_executesql下会失败。

2 个答案:

答案 0 :(得分:0)

我使用了很多类似的查询。它正在发挥作用。

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

如何设置@sentFile的值?

答案 1 :(得分:0)

我们无法为From'动态设置“BULK INSERT文件路径。

您正在动态生成路径

set @sentFile = @StrImportFolder + N'etl_rnli_sent_'+ @loadDate + N'.txt'

此处@loadDate是文件名的可变组件。

上面给出的工作示例使用带有变量的固定路径事件:

SET @filepath = N'e:\5-digit Commercial.csv',

此处变量的每个案例都有一个固定路径。

因此,请尝试使用预定义的文件路径。