Экранирование подчеркивания в SSIS - PullRequest
0 голосов
/ 05 мая 2020

У меня есть выражение SSIS. Как показано ниже: Я отправляю результаты этого пакета в виде sms, однако sms не показывает подчеркивания, поэтому я решил использовать тире на данный момент.

Смс отображается как OLEGALINITTEST

Есть ли способ избежать подчеркивания, чтобы он отображался в смс?

REPLACE (@ [System :: PackageName], "_", "-") = O-LEGAL-INIT-TEST

Желаемый результат - O_LEGAL_INIT_TEST

Я заменяя знак подчеркивания в строке дефисом "-". Я отправляю переменную в пакет Oracle, который отправляет фактическое sms.

1 Ответ

0 голосов
/ 05 мая 2020

@[System::PackageName] обычно совпадает с именем файла без расширения файла, поэтому, учитывая пакет с именем This-Is-Fun.dtsx, мы ожидаем увидеть свойство PackageName как This-Is-Fun.

Но есть случаи где это не так. Если мы назвали наш пакет A=B.C_D.dtsx, результирующее имя объекта для нашего пакета будет A B C_D. Каждый оскорбительный символ заменяется пробелами.

Если вы попытаетесь назвать объект SSIS «чем-то странным», это приведет к ошибке операции, например

Имя не может содержать никаких из следующих символов: / \: []. =

Ограничения аналогичны, но различаются для самого имени пакета, поскольку Windows / Visual Studio не допустит, чтобы

содержал любой из следующих символов: /? : & \ * "<> | #%

содержать управляющие символы Unicode содержат недопустимые суррогатные символы

символы являются зарезервированными системой именами, включая 'CON', 'AUX', 'PRN', 'COM1 '

или' LPT2 'быть'. ' или '..'

Как всегда с выражениями в SSIS, проверьте, что вы создаете. Создайте переменную SSIS, в которой вы указываете выражение.

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

REPLACE(@[System::PackageName], " ", "_")

Учитывая имя начального пакета

  • a = b .SO_61618859_This_Is_Fun.dtsx
  • System :: PackageName становится a b SO_61618859_This_Is_Fun
  • SMS_CONTENT становится a_b_SO_61618859_This_Is_Fun

Если он работает нормально во время разработки, но не работает в производстве, зарегистрируйте значение через информационное событие задачи сценария, чтобы вы могли просматривать журналы после запуска. https://billfellows.blogspot.com/2016/04/biml-script-task-test-for-echo.html Вам не нужно Biml, просто отметьте переменную как часть коллекции переменных только для чтения и следующий сценарий будет записывать значения в журнал. В вашем случае я бы добавил System :: PackageName, а затем мою переменную SSIS, User :: SMS_CONTENT

bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
    Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
...