Пакет служб 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 и т. д. к счастью, он по-прежнему использует старый способ получения метаданных .

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