Пакет 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