Пакет служб SSIS не хочет получать метаданные временной таблицы
у меня есть пакет служб SSIS, который содержит несколько потоков.
каждый поток отвечает за создание "промежуточной" таблицы, которая заполняется после создания. Эти таблицы глобальные временные таблицы.
я добавил 1 дополнительный поток (я не сделал пакет), который делает точно так же, как указано выше, для другой таблицы. Однако по какой-то причине пакет периодически терпит неудачу в этом потоке, в то время как он точно такой же, как и другие, кроме некоторой таблицы имена.
ошибка, которая продолжает появляться:
Update-Insert Data Flow: Error: SSIS код ошибки DTS_E_OLEDBERROR. - Произошла ошибка OLE DB. Код ошибки: 0x80004005. Запись OLE DB доступный. Источник: "собственный клиент Microsoft SQL Server 11.0" Hresult: 0x80004005 описание: "неопределенная ошибка". 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)
5 ответов
используя WITH RESULT SETS
чтобы явно определить метаданные позволит SSIS пропустить 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))
)
другой вариант (вид взлома, но он работает и не требует от вас изменить использование глобальных временных таблиц) - использовать команду 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 и не будет жаловаться на невозможность определить метаданные вашей временной таблицы, потому что она даже не будет пытаться.
Если вы работаете над SSIS 2012, то он использует системную хранимую процедуру процедура sp_describe_first_result_set извлечение метаданных из таблиц и не поддерживает временные таблицы. Но вы можете перейти на другие параметры, такие как переменные таблицы и CTEs, которые будут работать нормально. https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables
Я обнаружил, что проблема заключалась в проблеме дублирования GUID, я скопировал элементы (например, для создания временных таблиц), и все они получили тот же guid при копировании. Я использовал инструмент для сброса всех этих GUID в моем пакете, и это решило мою проблему.
спасибо!
была такая же проблема, как мы используем временную таблицу для постановки. Потратив некоторое время, нашел работу.
в назначении OLE DB/ADO задачи потока данных, где вы указываете имя промежуточной таблицы .
измените свойство AccessMode на команду SQL вместо OpenRowSet и укажите свойство команды SQL на "select * from #temp".
Ура, его работа, как и ожидалось.
Catch здесь, когда вы указываете режим доступа, отличный от SQL Команда SSIS ожидает, что это будет таблица / представление, и она изменила SSIS на вызов sp_describe_first_result_set для получения метаданных. но когда вы указываете команду SQL, она ожидает запрос или команду SP и т. д. к счастью, он по-прежнему использует старый способ получения метаданных .