Как назначить числовое значение результата SQL-запроса переменной пакета типа данных Double? - PullRequest
0 голосов
/ 27 июля 2011

У меня есть простая задача - заполнить пользовательскую переменную с помощью 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 Ответ

2 голосов
/ 27 июля 2011

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

Я думаю, что описанная вами проблема связана с ограничением в 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 изменится. Ячейка не является строкой. См. снимки экрана # 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.В качестве набора результатов должна быть задана переменная StringValue.

. На вкладке Поток управления поместите Script Task после задачи «Выполнение SQL».Эта задача сценария просто показывает значение, которое будет присвоено переменной DoubleValue из-за выражения, которое мы только что настроили.Дважды щелкните «Задача сценария», чтобы вызвать редактор задач сценария.Нажмите кнопку Редактировать скрипт ... , чтобы вызвать редактор 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...