2013-08-09 1 views
4

У меня есть этот код в 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.

+2

Пожалуйста, проверьте [здесь] (http://stackoverflow.com/questions/4050790/bulk-insert-using-stored-procedure) – Romesh

+0

Привет, Ром, я бы прочитал эту страницу раньше - я что-то пропустил? – RichJohnstone

+2

Вы говорите, что '@ bulk_cmd' является' NVARCHAR' - попробуйте использовать префиксы 'N' для всех строковых литералов, которые вы объединяете в' @ bulk_cmd'. Также: перед печатью вы напечатали '@ bulk_cmd'? Это выглядит нормально? Глупый вопрос: передаете ли вы правильное значение в '@ sent_file'? –

ответ

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?

+0

Я редактировал код выше, чтобы показать, как они установлены. '@ p_loadDate' является параметром SP. – RichJohnstone

0

Мы не можем установить путь к файлу From' динамически для BULK INSERT.

Вы генерируете путь динамически

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

Здесь @loadDate переменная составляющая имени файла.

Рабочий пример, приведенный выше, использует фиксированное событие пути с переменной:

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

Здесь переменная имеет путь исправления для каждого случая.

Итак, попробуйте использовать путь к файлу с предварительным определением.