Выполнение задачи SQL -Full Result Set Datatype Ошибка несоответствия

Я создаю пакет SSIS, который выполняет задачу выполнения SQL, и передает переменную набора результатов в каждый контейнер цикла. Мой запрос Sql:

Select distinct code from house where active=1 and campus='W'

Я хочу, чтобы выполняемая задача sql выполняла этот запрос и присваивала свои результаты переменной, которая передается в каждый контейнер цикла, который должен прокручивать все значения в наборе результатов.

Но моя задача выполнения sql завершилась с ошибкой:

Тип значения (DBNull), назначаемого переменной «User :: house», отличается от текущего типа переменной (String)

Теперь я сделал свое исследование, и я попытался назначить переменный тип данных Object, но не работал. Я пробовал использовать листинг в моем sql-запросе, и это тоже не сработало.

Поскольку мой запрос возвращает несколько строк и один столбец, я не уверен, как я могу назначить тип данных для всего запроса?

Образец:

  • Код
  • Арканзас
  • BN
  • CN

Всего 3 ответа


переменная «User :: house» является строкой, поэтому вы использовали ее в наборе результатов?


Похоже, у вас есть множество проблем.

Набор результатов

Первая из них - в вашей задаче SQL Execute и необходимость согласования спецификации Result Set и типа данных переменных (переменных), указанных на вкладке «Набор результатов». Если вы укажете Full Resultset, то принимающий объект должен иметь тип System :: Object, и вы получите только 1 набор результатов. Тип используемого диспетчера подключений (ODBC / OLE / ADO) определяет, как вы его определяете, но он бесконечно доступен для поиска на этих прекрасных форумах.

Другие два варианта: Single Row и XML. За 13 лет работы с SSIS у меня никогда не было причин указывать XML. Это оставляет нас с Single Row. Для набора результатов одиночной строки вам необходимо предоставить переменную для каждого возвращенного столбца, и ее необходимо правильно ввести.

Чтобы исправить вашу проблему, вам нужно объявить вторую переменную. Обычно я вызываю свой rsObject (объект набора записей), а затем указываю тип данных как System.Object.

Для каждого контура конвейера

Затем для каждого контейнера контура будет установлен Enumerator «Foreach ADO Enumerator», а затем переменная источника объекта ADO станет «User :: rsObject»,

В сопоставлениях переменных вы укажете переменную User :: house для индекса 0.

тестирование

Учитывая примерный набор исходных исходных данных, вы можете убедиться, что ваша задача Execute SQL правильно присваивает набор результатов нашему объекту, а контейнер цикла Foreach правильно заполняет нашу переменную.

SELECT DISTINCT
    code
FROM
(
    VALUES
        ('ABC', 1, 'w')
    ,   ('BCD', 1, 'w')
    ,   ('CDE', 0, 'w')
    ,   ('DEF', 1, 'w')
    ,   ('EFG', 1, 'x')
) house(code, active, campus)
WHERE
    active = 1
    AND campus = 'w'

Если вы измените значение кампуса от w до того, что не существует, например, f то все будет работать.

Тем не менее, полученная вами ошибка может быть сгенерирована только в том случае, если код равен NULL

Добавьте еще одну запись в коллекцию VALUES, например

    ,   (NULL, 1, 'w')

и когда Контейнер For Each Loop Container попадает в это значение, вы столкнетесь с сообщением об ошибке

Тип значения (DBNull), назначаемого переменной «User :: house», отличается от текущего типа переменной (String)

Что теперь?

Переменные SSIS не могут изменять свой тип данных, если только они не имеют тип Object (но это не решение здесь). «Проблема» заключается в том, что вы не можете сохранить значение NULL в переменной SSIS (если только это не объект типа). Поэтому вам нужно либо исключить строки, которые возвращают NULL (а AND code IS NOT NULL ), либо вам нужно отбросить NULL в значение sentinel / placeholder в качестве замены SELECT DISTINCT ISNULL(code, '') AS code ). Если пустая строка является допустимым значением, вам нужно найти что-то, что не является - «billinkcisthegreatestever10123432» вряд ли будет существовать в вашем наборе кодов, но это может быть немного чрезмерным.

Наконец, подумайте о переименовании переменной SSIS из house в code . Возможно, вы сможете держать вещи прямо, но когда-нибудь вы передадите этот код кому-то еще для обслуживания, и вы не хотите их путать.

Живописный ответ https://stackoverflow.com/a/13976990/181965


вам нужно объявить сыну «объект» var для набора результатов набора результатов

затем объявите строковую переменную для каждого кода из вашего результата

Для каждого контейнера- конвейера удачи


Есть идеи?

10000