Использование временных таблиц в службах SSIS

Я использую временную таблицу в хранимой процедуре в SQL Server. Я пытаюсь использовать этот SP в Редакторе источника OLE DB.

Я вижу выходные данные, возвращаемые в Построителе запросов, который поставляется с кнопкой запроса сборки. Но когда я нажимаю вкладку столбцы, я получаю следующую ошибку.

- название: Microsoft Visual Studio

ошибка в задаче потока данных [источник OLE DB [1]]: Код ошибки служб SSIS DTS_E_OLEDBERROR. Произошла ошибка OLE DB. Код ошибки: Ошибка 0x80004005. Доступна запись OLE DB. Источник: "Microsoft SQL Собственный клиент сервера 10.0 "Hresult: 0x80004005 описание:" недопустимо имя объекта "# # Payment".".

ошибка в задаче потока данных [источник OLE DB [1]]: невозможно получить столбец информация из источника данных. Убедитесь, что ваша целевая таблица в база данных доступна.

означает ли это, что я не могу использовать временные таблицы в SP, если я хочу, чтобы он был потреблен SSIS

7 ответов


есть еще одно решение, упомянутое в http://sqlserverpedia.com/blog/sql-server-bloggers/ssis-stored-procedure-metadata/. Посмотрите на Вариант 3.

цитата: Добавьте некоторые метаданные и" set nocount on "в хранимую процедуру с предложением" short circuited if " (если 1=0) и фиктивной инструкцией select вверху. Я тестировал, пытаясь оставить "set nocount on", и это не сработало.

CREATE PROCEDURE [dbo] . [GenMetadata] AS 
SET NOCOUNT ON 
IF 1 = 0 
    BEGIN
         -- Publish metadata 
        SELECT   CAST (NULL AS INT ) AS id , 
                CAST (NULL AS NCHAR ( 10 )) AS [Name] , 
                CAST (NULL AS NCHAR ( 10 )) AS SirName 
    END 

 -- Do real work starting here 
CREATE TABLE #test 
    ( 
      [id] [int] NULL, 
      [Name] [nchar] ( 10 ) NULL, 
      [SirName] [nchar] ( 10 ) NULL 
    ) 

Я

УСТАНОВИТЬ FMTONLY ВЫКЛ в начале процедуры, которая скажет Не обрабатывать строки клиенту когда он не выполняется поскольку нет временной таблицы при разборе SP, следовательно, нет столбца, доступного при разборе.

Это меня окончательно :)


Если ошибка была вызвана во время торгов, то решение ajdams не будет работать, поскольку оно применяется только к ошибкам, возникшим при запуске пакета из агента SQL Server.

основная проблема заключается в том, что SSIS пытается решить метаданные. С его точки зрения, таблицы ## не существуют, поскольку он не может возвращать метаданные для объекта на этапе предварительного выполнения. Таким образом, вы должны найти способ удовлетворить его требование, чтобы таблица уже существовала. Есть несколько решений:

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

  2. используйте CTE вместо временных таблиц. Это работает, если исходный сервер 2005/2008. Это не поможет, если исходный сервер 2000.

  3. создайте таблицу ## в отдельной команде Execute SQL. Задайте для свойства RetainSameConnection соединения значение True. Установите DelayValidation в true для потока данных. Когда вы настраиваете поток данных, подделайте его, временно добавив поле SELECT TOP 0 = CAST (NULL AS INT) в верхнюю часть хранимой процедуры, которая имеет идентичные метаданные для вашего конечного вывода. Не забудьте удалить это из хранимой процедуры перед запуском пакета. Это также удобно трюк для обмена данными временной таблицы между потоками данных. Если вы хотите, чтобы остальная часть пакета использовала отдельные соединения, чтобы они могли работать параллельно, необходимо создать дополнительное не общее соединение. Это устраняет проблему, так как временная таблица уже существует во время выполнения задач потока данных.

опция 3 достигает вашей цели, но она сложна и имеет ограничение, которое вы должны разделить команду create ## на другую сохраненную вызов процедуры. Если у вас есть возможность создавать хранимые процедуры на исходном сервере, то у вас, вероятно, также есть возможность создавать другие объекты, такие как промежуточные таблицы, и это обычно лучшее решение. Это также побочные шаги возможных проблем с разногласиями TempDB, что также является желательным преимуществом.

удачи и дайте мне знать, если вам нужны дополнительные рекомендации о том, как реализовать Шаг 3.


нет, это проблема с разрешениями. Это должно помочь вам:

http://support.microsoft.com/kb/933835


для всех хлопот, связанных, я думаю, что это, вероятно, просто не стоит. Создайте реальную таблицу в БД и усеките ее до / после загрузки. Если это для datawarehouse, не имеет значения, есть ли у вас дополнительный стол или два. Это дает вам средства разработки SSIS и вам не придется беспокоиться о intracacies из временных таблиц.

Если вы хотите сохранить вещи отдельно, то просто создайте временные таблицы SSIS в отдельной схеме. Вы можете использовать разрешения сделайте эту schmema невидимой для всех других пользователей.

CREATE SCHEMA [ssis_temp]

CREATE TABLE [ssis_temp].[tempTableName]

эти шаги помогли мне:

  1. запишите конечный набор результатов в таблицу.
  2. скрипт этой таблицы как CREATE в новом окне редактора запросов.
  3. удалите все, кроме открытых и закрытых скобок, которые определяют столбцы.
  4. оберните это в другую пару скобок.
  5. Перекомпозировать вызов вашего SP из

    exec p_MySPWithTempTables ?, ?

на

exec p_MySPWithTempTables ?, ? with result sets
(
    (
        ColumnA int,
        ColumnB varchar(10),
        ColumnC datetime
    )
)

вы можете использовать переменные таблицы вместо временных таблиц . это сработает