Агент SQL Server и пакеты служб SSIS - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь передать значение переменной из задания агента SQL Server в пакет служб SSIS, но в переменной содержится апостроф, приводящий к сбою задания агента SQL Server

, например, в агенте SQL Server на этапе заданияСвойства Я ввожу следующие данные:

Property Path: \Package.Variables[User::VariableName].Properties[Value] Property 
Value: Michael O'Callaghan.

Есть идеи, как решить эту проблему?

Ответы [ 5 ]

0 голосов
/ 24 февраля 2019

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

Агент сервера SQL заключает переменное значение в одинарную кавычку, например, указывает Jon Doe в агенте сервера sqlагент оборачивает его как «Jon Doe» и передает его в пакет служб SSIS, поэтому, если вы введете значение с апострофом, это нарушит работу агента сервера sql и не выполнит пакет служб SSIS, который будет выглядетьэтот EG, передающий это значение: 'John O' Doe ', это приведет к тому, что агент прервет задание, поэтому вам нужно передать значение вашей переменной как: John O''Doe, и агент обернет его следующим образом:' John O '' 'Сделайте так, чтобы вам нужно было включить следующую логику в ваш пакет служб SSIS:

Объявить @TempVar nVarchar (50) SET @TempVar = REPLACE (?, '' '' '', CHAR (39))

Приведенный выше код создает переменную для хранения значения параметра.Он заменяет 4 одинарные кавычки на одну.CHAR (39) - это ASCII-представление одной кавычки.Это приведет к тому, что значение переменной будет выглядеть как John O'Doe.Надеюсь, это поможет.

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

0 голосов
/ 22 февраля 2019

Альтернативный способ справиться с этим, и, честно говоря, я думаю, что лучший способ - это использовать переменные среды.Насколько мне известно, это было введено, когда Microsoft развернула модель развертывания проекта с SQL Server 2012 в качестве замены модели развертывания пакета.Модель развертывания пакета требовала, чтобы параметры пакета были указаны в отдельном XML-файле для развертывания на сервере.С помощью модели развертывания проекта Microsoft создала удобный пользовательский интерфейс в SQL Server для управления этим - файл XML был удален.

Короче говоря, переменные среды позволяют разработчикам связывать параметры пакета, но не переменные пакета, поскольку они являются внутренними для самого пакета , для SQL Server и, таким образом, представляют их на сервере.Это делает невероятно простым управление одинаковыми параметрами пакетов, которые существуют в разных пакетах (например, диспетчеры соединений, расположение сетевых папок в формате FQDN и т. Д.)Идея заключается в том, что если пакеты нужно указывать на новый сервер или новую сетевую папку, то разработчики могут просто изменить одно значение в SQL Server, которое затем распространится на все пакеты без необходимостиоткройте, измените и повторно разверните пакет.

Подробные инструкции о том, как это сделать, см. в следующих ссылках:

Microsoft: Это немного сухо, но всеобъемлющий и изо рта лошади.

SQL Chick: Более интуитивно понятный и предоставляет скриншоты, которые я считаю полезными.

0 голосов
/ 20 февраля 2019

Побег.Просто используйте двойной апостроф.'' (не цитата ", а апостроф апостроф) .

0 голосов
/ 21 февраля 2019

Попробуйте стандартный способ поддержки файла конфигурации (если вы используете 2008 или менее) и передайте значения переменных через файл.

0 голосов
/ 20 февраля 2019

Если пакет развернут в SSISDB и выполнен оттуда, используйте хранимые процедуры SSISDB, чтобы установить значение и экранировать кавычку, как если бы вы использовали T-SQL.Задание агента SQL затем может использовать сценарий T-SQL для этого шага.В приведенном ниже примере используется хранимая процедура set_execution_parameter_value для установки этого значения и все равно будет передаваться «Michael O'Callaghan».

DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT, 
@folder_name=N'Project Folder', @project_name=N'Project', @use32bitruntime=False, @reference_id=Null

DECLARE @var0 SQL_VARIANT = N'Michael O''Callaghan'
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'Name', @parameter_value=@var0

DECLARE @var1 SMALLINT = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1

EXEC [SSISDB].[catalog].[start_execution] @execution_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...