У меня есть такой код, который я использую для выполнения BULK INSERT файла данных в таблице, где файл данных и имя таблицы являются переменными:
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 по-прежнему (и, следовательно, не иметь доступа к temp table).
Итак, это оставляет мне только один вариант, который должен использовать таблицу без temp и добиться изоляции процесса по-другому (гарантируя, что только один процесс может использовать таблицы в любой момент времени - я могу думать о несколько способов сделать это).
Это раздражает. Было бы гораздо удобнее делать это так, как я изначально планировал. Просто одна из тех вещей, которые должны быть тривиальными, но в конечном итоге есть целый день вашего времени...