Пакет SSIS, не требующий получения метаданных временной таблицы
У меня есть пакет SSIS, который содержит несколько потоков.
Каждый поток отвечает за создание таблицы "постановки", которая заполняется после создания.
Эти таблицы представляют собой глобальные временные таблицы.
Я добавил 1 дополнительный поток (я не сделал пакет), который делает точно так, как указано выше, для другой таблицы. Однако по какой-то причине пакет прерывается с перерывами в этом потоке, в то время как он точно такой же, как и другие, помимо некоторых имен таблиц.
Ошибка, которая продолжает появляться:
Обновление - Вставка потока данных: ошибка: код ошибки SSIS DTS_E_OLEDBERROR. Ошибка OLE DB. Код ошибки: 0x80004005. Запись OLE DB доступный. Источник: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Описание: "Unspecified error". OLE DB запись доступна. Источник: "Собственный клиент Microsoft SQL Server 11.0" Hresult: 0x80004005 Описание: "Метаданные не могут быть определены, потому что оператор" select * from '## TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1' 'использует временную таблицу. ".
Создание выражения:
"CREATE TABLE " + @[User::TmpMcsConfigurationDeviceHistory] + " ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
"
Обобщенное выражение (= оценено):
CREATE TABLE ##TmpMcsConfigurationDeviceHistory764E56F088DC475C9CC747CC82B9E388 ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
Ответы
Ответ 1
Я обнаружил, что проблема связана с дублированной проблемой GUID, я скопировал элементы (например, тот, что создал временные таблицы), и все они получили тот же самый указатель при копировании. Я использовал инструмент для reset всех этих guids в моем пакете, и это решило мою проблему.
Спасибо!
Ответ 2
Используя WITH RESULT SETS
для явного определения метаданных, вы сможете пропустить шаг sp_describe_first_result_set
и использовать метаданные, которые вы определяете. Положительный момент заключается в том, что вы можете использовать это, чтобы заставить SSIS выполнять SQL, содержащий временную таблицу (для меня это очень помогло); недостатком является то, что вы должны вручную поддерживать и обновлять это, если что-то изменится.
Пример запроса (хранимая процедура:)
EXEC ('dbo.MyStoredProcedure')
WITH RESULT SETS
(
(
MyIntegerColumn INT NOT NULL,
MyTextColumn VARCHAR(50) NULL,
MyOtherColumn BIT NULL
)
)
Пример запроса (простой SQL:)
EXEC ('
CREATE TABLE #a
(
Col INT
)
INSERT INTO #a
(
COL
)
SELECT 1 AS Col
SELECT Col
FROM #a')
WITH RESULT SETS ( (Col INT NOT NULL))
)
Ответ 3
Другой вариант (вид хака, но он работает и не требует изменения вашего использования глобальных временных таблиц) заключается в использовании команды SET FMTONLY ON перед вашим фактическим запросом, чтобы отправить фальшивку "Первый результат установите" в SSIS с правильной структурой столбцов. Таким образом, вы можете сделать что-то вроде
SET FMTONLY ON
select 0 as a, 1 as b, 'test' as C, GETDATE() as D
SET FMTONLY OFF
select a, b, c, d from ##TempTable
Когда SSIS запускает sp_describe_first_result_set, он вернет имена метаданных и столбцов вашей команды FMTONLY и не будет жаловаться на невозможность определить метаданные вашей временной таблицы, потому что она даже не попытается.
Ответ 4
Если вы работаете в SSIS 2012, он использует системную хранимую процедуру sp_describe_first_result_set для получения метаданных таблиц и не поддерживает временные таблицы. Но вы можете пойти и на другие параметры, такие как переменные таблицы и CTE, которые будут работать нормально. https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables
Ответ 5
Имела ту же проблему, что и временная таблица для постановки. Проведя некоторое время, нашли работу.
В OLE DB/ADO Назначение задачи потока данных, где вы указываете имя промежуточной таблицы.
Измените свойство AccessMode на команду SQL вместо OpenRowSet и укажите свойство SQL Command для "select * from #temp".
Ура, работающая как ожидалось.
Поймать здесь, когда вы указываете режим доступа, отличный от SQL Command, SSIS ожидает, что это таблица/представление, и он изменил SSIS, чтобы вызвать sp_describe_first_result_set для получения метаданных. но когда вы укажете SQL Command, он ожидает запроса или команды SP и т.д., к счастью, он все еще использует старый способ получения метаданных.
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cfe1c7c1-910a-4f52-9718-c3406263b177/usage-of-temp-tables-in-ssis-2012?forum=sqlintegrationservices#cfe1c7c1-910a-4f52-9718-c3406263b177
Ответ 6
Джейми Томсон написал об этом сценарии некоторое время назад. Это должно по-прежнему работать (в 2012 году):
http://consultingblogs.emc.com/jamiethomson/archive/2006/11/19/SSIS_3A00_-Using-temporary-tables.aspx