У меня есть такой код, который я использую, чтобы выполнить НАСТРОЙКУ НАСТРОЙКИ файла данных в таблицу, где файл данных и имя таблицы являются переменными:
DECLARE @sql AS NVARCHAR(1000)
SET @sql = 'BULK INSERT ' + @tableName + ' FROM ''' + @filename + ''' WITH (CODEPAGE=''ACP'', FIELDTERMINATOR=''|'')'
EXEC (@sql)
Работает нормально для стандартных таблиц, но теперь мне нужно сделать то же самое, чтобы загрузить данные в временную таблицу (например, #MyTable
). Но когда я пытаюсь это сделать, я получаю сообщение об ошибке:
Invalid Object Name: #MyTable
Я думаю, что проблема связана с тем фактом, что оператор BULK INSERT
создается на лету, а затем выполняется с использованием EXEC
, а #MyTable
недоступен в контексте вызова EXEC
.
Причина, по которой мне нужно создать оператор BULK INSERT
, заключается в том, что мне нужно вставить имя файла в оператор, и, похоже, это единственный способ сделать это. Итак, кажется, что я могу либо иметь переменную имя файла, или использовать временную таблицу, но не обе.
Есть ли другой способ добиться этого - возможно, с помощью OPENROWSET(BULK...)
?
UPDATE:
Хорошо, так что я слышу, что BULK INSERT и временные таблицы не будут работать для меня. Спасибо за предложения, но перемещение моего кода в динамическую часть SQL в моем случае нецелесообразно.
Попробовав OPENROWSET(BULK...)
, кажется, что он страдает той же проблемой, то есть не может работать с переменным именем файла, и мне нужно было бы динамически создавать оператор SQL, как раньше (и, следовательно, не иметь доступа к временная таблица).
Итак, у меня остается только один вариант - использовать не временную таблицу и добиться изоляции процесса другим способом (гарантируя, что только один процесс может использовать таблицы одновременно - я могу подумать несколько способов сделать это).
Это раздражает. Было бы гораздо удобнее сделать это так, как я изначально планировал. Просто одна из тех вещей, которая должна быть тривиальной, но в конечном итоге она съедает целый день ...