Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Ограничение 4k , которое удалено в выпуске служб интеграции SQL Server 2012 года, применяется только к выражениям.
Поэтому, если вам нужно спуститься по маршруту, в котором вы сейчас путешествуете, построив исходный запрос, объединив все эти идентификаторы пользователя вместе, прекратите использование выражения и выполните конкатенацию строк в задаче скрипта.
Пример кода
Dts.Variables[SourceQuery].Value = string.Format("select * from dept where dept in ({0}), Dts.Variables[EmpList].Value.ToString());
Я создал простой пакет. Задача сценария, связанная с потоком данных с переменной, определенной как 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;
При выполнении, вот
[/g2]
Внутри моего потока данных я использую команду SQL из переменной, так как это единственное, что будет иметь смысл, учитывая, что мы используем переменную ...
[/g3]