Sql server 大容量插入作为动态sql失败
我在设置批量插入的SP中有以下代码: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\'
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的一个参数。