Как обрабатывать значения NULL, возвращаемые хранимой процедурой из пакета служб SSIS? - PullRequest
1 голос
/ 29 апреля 2011

Я новичок в ssis и у меня возникли проблемы с загрузкой результатов хранимой процедуры, включающей значения NULL, в таблицу с ssis. Вот что у меня есть:

Шаг 1

Выполнить хранимую процедуру в базе данных1 вернет полный набор результатов и поместит в объект ADO User::CallResults

Шаг 2

Затем я перебираю результаты User::CallResults, отображая 2 переменные:

Variable         Index ADO object Type     Nullable  
User::ID         0      Object              NO  
User::Result     1        Object              Yes    

Шаг 3

Затем в Insert Row Into Database2 берет каждую строку и выполняет «insert to dbo.myTable id, значения результата (?,?)»

Я сопоставляю ID как int и Result как long соответственно.

При выполнении я получаю сообщение об ошибке:

failed with the following error: "An error occurred while extracting the result into a variable of type (DBTYPE_I4)". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Похоже, что это ошибка, когда в Result есть ноль. Какие-либо предложения, чтобы ssis позволял нули?

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Вы можете выполнить процесс, который вы описали в вопросе, используя Data Flow task.Вот пошаговое описание выборки данных с использованием хранимой процедуры, а затем вставки в таблицу, и все это делается внутри Data Flow task.Этот пример просто для того, чтобы дать представление о том, как это можно сделать, и он использует только один экземпляр SQL Server.

Пошаговый процесс:

  1. Создайте две таблицы с именами dbo.Source и dbo.Destination и заполните таблицу dbo.Sourceданные, как показано на скриншоте # 1 .Сценарии создания таблиц предоставляются в разделе Сценарии .

  2. Создайте хранимую процедуру с именем dbo.GetData, используя скрипт, предоставленный в разделе Сценарии .

  3. В пакете служб SSIS создайте переменную с именем StoredProcedure, как показано на скриншоте # 2 .Эта переменная будет содержать оператор выполнения хранимой процедуры.

  4. Создать OLE DB Connection в диспетчере соединений для подключения к экземпляру SQL Server.

  5. На вкладке Control Flow пакета служб SSIS поместите Data Flow task, как показано на скриншоте # 3 .

  6. Дважды щелкните Data flow taskдля перехода на вкладку Data Flow.На вкладке «Поток данных» поместите OLE DB Source и OLE DB Destination, как показано на скриншоте # 4 .

  7. Настройте OLE DB Source, как показано на скриншотах# 5 и # 6 .Обратите внимание, что источник использует переменную, созданную на шаге № 3.Данные, возвращаемые хранимой процедурой, будут источником ввода.

  8. Настройте «OLE DB Destination», как показано на скриншотах # 7 и # 8.Это вставит данные в таблицу назначения.

  9. Снимок экрана # 9 отображает пример выполнения пакета.

  10. Снимок экрана # 10 показывает данные в таблицах после выполнения пакета.Обратите внимание, что таблица назначения содержит NULL значений.Это возможно, поскольку столбец Кол-во может принимать NULL значений.Однако, если бы мы передали NULL значения в столбец ItemNumber , пакет потерпел бы неудачу, так как столбец не обнуляем.

Надеюсь, это поможет.

Скрипты: .

CREATE TABLE [dbo].[Destination](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [varchar](50) NOT NULL,
    [Qty] [int] NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Source](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [varchar](50) NOT NULL,
    [Qty] [int] NULL,
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[GetData]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      Id
            ,   ItemNumber
            ,   Qty
    FROM        dbo.Source
END
GO

Снимок экрана № 1:

1

Скриншот №2:

2

Скриншот № 3:

3

снимок экрана № 4:

4

снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

1 голос
/ 06 мая 2011

Не совсем ответ, но так как код не может быть хорошо отформатирован в комментарии, я помещаю его здесь.

Понимаете ли вы, что если ваши базы данных находятся на одном сервере, вы можете сделать это:

INSERT INTO 
    database1.dbo.Results
EXEC 
    database2.dbo.SampleStoredProcedure @param1, @param2, @param3
0 голосов
/ 06 мая 2011

Поместите эту логику в поток данных.После этого просто выполните массовую вставку, и она должна пропустить пустые значения.

SSIS - невозможно вставить NULL для пустых полей в BULK INSERT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...