Как назначить числовое значение результата запроса 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:
# 2:
# 3:
# 4:
# 5:
# 6:
# 7:
# 8:
# 9: