Как назначить числовое значение результата запроса SQL переменной пакета типа Double?

У меня есть то, что должно быть простой задачей - заполнить пользовательскую переменную с помощью ResultSet из задачи "Выполнение SQL"

SELECT MainID FROM TableA WHERE TableA_ID = 1` 

(Это вернет только один столбец и одну строку).

MainID в настоящее время хранится как пользовательский тип данных в базе данных. Значение сохраняется в формате XXXX.Y (например, 8008.1).

Если я изменю UserVariable на тип данных String, я могу без проблем присвоить значение либо CASTing, либо CONVERTing ResultSet в STRING/NUMERIC/FLOAT.

SELECT CAST(MainID as NUMERIC(9,1)) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CAST(MainID as FLOAT) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CAST(MainID as VARCHAR(10)) as 'MainID' FROM TableA WHERE TableA_ID = 1;

или же

SELECT CONVERT(NUMERIC(9,1), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CONVERT(FLOAT, MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CONVERT(VARCHAR(10), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;

Тем не менее, я не могу присвоить значение, если тип переменной пользователя является DOUBLE. Я получаю следующее сообщение об ошибке:

Ошибка [Выполнение SQL] Ошибка: произошла ошибка при назначении значения переменной "dUserVariable": "Тип значения, назначаемого переменной"User::dUserVariable", отличается от текущего типа переменной. Переменные могут не изменять тип во время выполнения Типы переменных являются строгими, за исключением переменных типа Object. "

Я довольно новичок в SSIS, поэтому я немного озадачен тем, как пройти через это преобразование.

Есть идеи?

1 ответ

Решение

Я не уверен, что следующий вариант будет работать в задаче веб-службы, но вы можете попробовать.

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

Вот простой пошаговый пример, который иллюстрирует вариант, который вы можете попробовать. Этот пример был создан в SSIS 2008 R2,

Создайте пакет служб SSIS. В начале я назвал пакет в формате YYYYMMDD_hhmm, после чего SO означает переполнение стека, затем идентификатор вопроса SO и, наконец, описание. Это для меня, чтобы легко отослать это позже. Смотрите скриншот №1.

На пакете создайте две переменные, а именно StringValue а также DoubleValue, Установите переменную StringValue в числовое значение (скажем, 0). Это необходимо, чтобы выражение, которое мы собираемся настроить в переменной DoubleValue, не выдавало ошибку. Выберите переменную DouleValue и нажмите F4, чтобы просмотреть свойства. Установите для свойства EvaluateAsExpression значение True и установите для свойства Expression значение (DT_DECIMAL, 2) @[User::StringValue]NOTE: В этот момент тип данных в переменной DoubleValue изменится на Cell, а не на строку. Смотрите скриншоты № 2 и № 3.

В пакете создайте диспетчер соединений OLE DB с некоторой базой данных SQL Server. Я создал соединение с базой данных Adventure Works, которая у меня есть на локальном компьютере. Смотрите скриншот №4.

На вкладке Поток управления разместите Execute SQL Task и настройте его, как показано на скриншотах № 5 и № 6. Дважды щелкните на задаче "Выполнение SQL", чтобы вызвать редактор задач "Выполнение SQL". Установите ResultSet на SingleRow потому что мы будем выбирать только одно значение. Установите строку подключения в диспетчере соединений OLE DB. Оператор SQL должен быть установлен в SELECT CAST('3.14' AS NUMERIC(10,2)) AS ValueOfPi, Result Set должен быть установлен в переменную StringValue,

На вкладке Поток управления разместите Script Task после выполнения задачи SQL. Эта задача сценария просто показывает значение, которое будет присвоено переменной DoubleValue из-за выражения, которое мы только что настроили. Дважды щелкните "Задача сценария", чтобы вызвать редактор задач "Сценарий". Нажмите кнопку Edit Script..., чтобы вызвать редактор VSTA. Замените метод Main() кодом, приведенным в разделе "Код задачи скрипта". Смотрите скриншоты № 7 и № 8.

Выполнить пакет. Значение в переменной DoubleValue должно отображаться в окне сообщения. Смотрите скриншот №9.

Надеюсь, это поможет.

Код задачи скрипта:

C# код, который можно использовать только в SSIS 2008 and above,

public void Main()
{
    Variables varCollection = null;
    Dts.VariableDispenser.LockForWrite("User::DoubleValue");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    MessageBox.Show(varCollection["User::DoubleValue"].Value.ToString());

    Dts.TaskResult = (int)ScriptResults.Success;
}

Скриншоты:

# 1:

1

# 2:

2

# 3:

3

# 4:

4

# 5:

5

# 6:

6

# 7:

7

# 8:

8

# 9:

9

Другие вопросы по тегам