Как изменить ограничение символа .text на более 4000 символов в ssis [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

0
задан Dinesh Kal 20 January 2014 в 20:58
поделиться

1 ответ

Ограничение 4k , которое удалено в выпуске служб интеграции SQL Server 2012 года, применяется только к выражениям.

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

Пример кода

Dts.Variables[SourceQuery].Value = string.Format("select * from dept where dept in ({0}), Dts.Variables[EmpList].Value.ToString());

POC

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

            // 551 characters
            string baseQuery = @"
SELECT
    AC.object_id
,   AC.name
,   AC.column_id
,   AC.system_type_id
,   AC.user_type_id
,   AC.max_length
,   AC.precision
,   AC.scale
,   AC.collation_name
,   AC.is_nullable
,   AC.is_ansi_padded
,   AC.is_rowguidcol
,   AC.is_identity
,   AC.is_computed
,   AC.is_filestream
,   AC.is_replicated
,   AC.is_non_sql_subscribed
,   AC.is_merge_published
,   AC.is_dts_replicated
,   AC.is_xml_document
,   AC.xml_collection_id
,   AC.default_object_id
,   AC.rule_object_id
,   AC.is_sparse
,   AC.is_column_set
FROM
    sys.all_columns AS AC
WHERE
    AC.object_id IN (0{0});";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = 0; i < 1000; i++)
            {
                sb.Append(',');
                sb.Append(i);
            }
            string queryFinal = string.Format(baseQuery, sb.ToString());
            MessageBox.Show(queryFinal.Length.ToString());
            Dts.Variables["QuerySource"].Value = queryFinal;

При выполнении, вот

enter image description here [/g2]

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

enter image description here [/g3]

7
ответ дан billinkc 17 August 2018 в 22:26
поделиться
  • 1
    Согласитесь, что я должен использовать компонент скрипта. Но как отправить эту строку в ole db microsoft oracle provider? В задаче потока данных, в источнике, я выбираю режим доступа = из переменной, где я должен выбрать это. В thid, как выражение, будет принимать более 4000 символов? – Dinesh Kal 21 January 2014 в 06:54
  • 2
    Да, попробуй – billinkc 21 January 2014 в 13:29
  • 3
    +1 для фотографий – Kermit 24 January 2014 в 22:14
Другие вопросы по тегам:

Похожие вопросы: