Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 大容量插入作为动态sql失败_Sql Server_Bulkinsert_Sp Executesql - Fatal编程技术网

Sql server 大容量插入作为动态sql失败

Sql server 大容量插入作为动态sql失败,sql-server,bulkinsert,sp-executesql,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\'

我在设置批量插入的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
在我的存储过程中,此操作失败,出现以下错误:

无法从链接服务器(null)的OLE DB提供程序“大容量”中获取行

但代码打印出来:

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

工作起来很有魅力。我不知道为什么它在
sp_executesql

下失败,我使用的是非常类似的查询。它正在发挥作用

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 声明@filepath nvarchar(500) SET@filepath=N'e:\5位数的Commercial.csv' 声明@bulkinsert NVARCHAR(2000年) SET@bulkinsert= N'从''大容量插入ZIPCodes'+ @文件路径+ N“”,其中(第一行=2,字段终止符=“”,,,行终止符=“”\N“”) EXEC sp_executesql@bulkinsert
如何设置@sentFile的值?

我们无法为
批量插入动态设置“
From”
文件路径

您正在动态生成路径

set @sentFile = @StrImportFolder + N'etl_rnli_sent_'+ @loadDate + N'.txt'
这里的
@loadDate
是文件名的可变组件

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

SET @filepath = N'e:\5-digit Commercial.csv',
在这里,变量对于每种情况都有一个固定路径


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

请检查Hi-ROM,我之前读过该页-我是否遗漏了一些内容?您是说
@bulk\u cmd
NVARCHAR
-尝试对所有要连接到
@bulk\u cmd
中的字符串文本使用
N
前缀。另外:在执行之前,您是否打印了
@bulk\u cmd
?看起来还好吗?愚蠢的问题:您是否将正确的值传递到
@sent_文件中
?我已经尝试了这个方法,并且成功了
Declare@test nvarchar(50)SET@test='select top 10*from table'execute sp_executesql@test
。可能
@sentFile
不是nvarchar
,他应该将其转换为
nvarchar
?您确定
nvarchar
变量的定义足够长吗?你能告诉我你在哪里声明变量吗?我已经编辑了上面的代码来显示它们是如何设置的
@p_loadDate
是SP的一个参数。