У меня есть этот код в SP, который устанавливает массовую вставку:Массовая вставка не удается, как динамический SQL
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
Внутри моей хранимой процедуры, это терпит неудачу с этой ошибкой:
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
Но код не распечатывается:
BULK INSERT loadSent
FROM 'D:\EMVImports\etl_sent_20130529.txt'
WITH (
FIRSTROW = 2
,formatfile='D:\EMVScripts\Sent_Format.xml'
)
работает как очарование. Я понятия не имею, почему это происходит под sp_executesql
.
Пожалуйста, проверьте [здесь] (http://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure) – Romesh
Привет, Ром, я бы прочитал эту страницу раньше - я что-то пропустил? – RichJohnstone
Вы говорите, что '@ bulk_cmd' является' NVARCHAR' - попробуйте использовать префиксы 'N' для всех строковых литералов, которые вы объединяете в' @ bulk_cmd'. Также: перед печатью вы напечатали '@ bulk_cmd'? Это выглядит нормально? Глупый вопрос: передаете ли вы правильное значение в '@ sent_file'? –