2015-02-11 5 views
0

Я успешно развернул множество пакетов SSIS (в SQL Server 2008 R2).Таблица Temp, потерянная немедленно в SSIS

Я обнаружил проблему, которая меня тошнит. Изучите основной следующий поток.

enter image description here

В «Загрузка файлов с FTP» Я поднимаю новые файлы, которые я хочу работать, и загрузить их на свой локальный диск, сохраняя подобранные файлы, так что они могут повторяться при в процессе каждого Файл foreach.

В 'Создать временную таблицу' Я создаю временную таблицу, как, например:

IF not exists (SELECT * FROM tempdb.dbo.sysobjects WHERE name='##tempProcessFiles' and xtype='U') 
CREATE TABLE ##tempProcessFiles 
(
--my columns 
) 
GO 

В 'усечение Temp таблицы' Я делаю:

TRUNCATE TABLE ##tempProcessFiles 

В принципе, я забрать некоторые файлы , создайте временную таблицу, а затем пропустите каждый файл, загрузив необходимый мусор в мою базу данных. Чтобы убедиться, что все выполняется гладко, я усекаю временную таблицу на каждой итерации, поэтому у меня есть свежая таблица для работы. На последнем шаге этого пакета я удаляю временную таблицу. Я также отбрасываю временную таблицу OnError.

Проблема заключается в том, что когда я планирую этот парень, создать временную таблицу выполняется отлично, но как только он достигнет «truncate temp table», он выдает исключение, поскольку временная таблица не существует. В частности:

Executing the query "TRUNCATE TABLE ##tempProcessFiles" failed with the following error: "Cannot find the object "##tempProcessFiles" because it does not exist or you do not have permissions.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Запуск этого пакета в режиме отладки не воссоздает этот сценарий. Все работает нормально.

Я обнаружил (после многих дней разочарования, преследуя идеи, которые посылали меня кругами), что, удалив инструкцию GO в «Создать таблицу темп», мой пакет будет выполняться нормально.

Было установлено, что ошибок или случайного падения моей временной таблицы не было. Кроме того, у меня всегда сохранялась информация о безопасности как ложная, всегда проверялась проверка достоверности, как всегда; но моя задача temp table temp не была запущена - я даже попытался развернуть ее с отключенным. Ни один из моих других пакетов не использовал эту глобальную таблицу temp, и в базе данных не было запланированных заданий или триггеров, которые отбрасывали это или что-то смешное.

Все, что я могу определить, заключается в том, что оператор GO приводил к тому, что моя сессия в базу данных прекращалась и вызывала немедленную замену моей таблицы temp. Это то, как работают операторы GO в SSIS? Если бы я запускал сценарий на SQL Server с использованием того же синтаксиса, что и у меня в моем пакете, я определенно не испытал бы такого рода вещи, поэтому он меня бросил на цикл. Но я не администратор базы данных, поэтому это, вероятно, что-то фундаментальное или тонкое в этой области работы.

Может ли кто-нибудь объяснить, что на самом деле произошло здесь? Или мне нужно будет предоставить более подробную информацию о моем пакете, чтобы получить достаточный ответ? Единственное изменение, которое я сделал, это удалить GO из «Create Temp Table», так что это было определенное исправление.

+0

Почему вы усекаете временную таблицу? И почему это глобальная временная таблица? – gbn

+0

Вы должны использовать глобальные временные таблицы в SSIS. Прочтите весь этот блог, если вы сомневаетесь во мне: http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/. Кроме того, я усекаю временную таблицу, потому что я загружаю ее данными из каждого файла. – Anonymouse

+0

Я бы использовал сохраненные таблицы в схеме wrk. Я бы не использовал временные таблицы вообще. Пример: если я загружаю Data.Foobar, у меня был бы wrk.foorbar для постановки данных. Я бы не использовал ## foobar ... – gbn

ответ

0

Кажется, что соединение в конце концов прекращается, несмотря на то, что RetainSameConnection. Чтобы собрать дополнительную информацию, попробуйте сделать следующее:

Запустите трассировку при выполнении пакета для подтверждения вышеуказанного (добавьте проверку безопасности> Вход/Выход и сеансы> Существующие соединения). Обратите внимание на StartTime и EndTime, может быть, это будет что-то интересное, например 30 секунд (время ожидания команды по умолчанию)?

Затем попробуйте запустить этот пакет только с задачами Crate и Truncate (без цикла), чтобы исключить возможность вмешательства других компонентов (источники данных с использованием того же диспетчера подключений?). Если он работает, попробуйте его с помощью цикла, но с заданием Truncate, которое находится внутри, и продолжайте добавлять другие компоненты.

+0

Я попробую это, это неплохая идея, так как я хочу понять, что происходит. Благодарю. – Anonymouse