Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
SQL Server 2005
Подскажите, пожалуйста, как в глобальную переменную пакета записать результат SQL запроса. В 2000-ом SQL Server'е был Dynamic Properties Task. Есть какой-нибудь аналог для 2005?
7 окт 09, 10:12    [7751618]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Причем здесь Dynamic Properties Task? В 2005 лехко записать результат запроса в любую соответствующую переменную.
Опишите задачу подробней.
7 окт 09, 10:16    [7751638]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
Вообще задача сосотоит в том, чтобы скопировать существующий файл в в файлы с именами, которые получаются в результате SQL запроса. Естественно, заранее неизвестно кол-во таких файлов. Файлы будут подготавливаться в том же пакете.
7 окт 09, 10:23    [7751695]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Создаете контейнер Foreach Loop Container, нумератором ему назначаете Foreach ADO Enumerator, который в свою очередь "замыкаете" на переменную, в которой будет хранится результат запроса, выполненного в задаче Execute SQL Task. Эта Execute SQL Task должна предшевствовать вашему "цикловому" контейнеру. В контейнер же помещаете Execute Process Task, которая и будет вам копировать файлы с нужными именами.
7 окт 09, 10:38    [7751799]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
tpg, спасибо. Пракитчески все понятно, за исключением
tpg
В контейнер же помещаете Execute Process Task, которая и будет вам копировать файлы с нужными именами.

Раньше я копировала через ActivX Script Task. Не подскажете, как для копирования можно использовать Execute Process Task (или где можно посмотреть)?
7 окт 09, 10:53    [7751900]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, откройте её что ли, поэксперементируйте - походите по закладкам, повыбирайте типы и т.д. и т.п.
7 окт 09, 11:26    [7752141]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Пардон! Ошибся с задачей - вместо Execute Process Task выберите File System Task.
7 окт 09, 11:38    [7752240]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
А, теперь более-менее понятно.
Не будете ли так любезны, чтобы помочь еще разобраться с Execute SQL Task?
Что нужно указать в закладках Parameter Mapping и ResultSet, чтобы в мою глобальную переменную QueryResult получить результат запроса типа
select поле from таблица
7 окт 09, 11:51    [7752365]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, если у вас запрос без параметров, то в Parameter Mapping - ничего.
В ResultSet выбираете из списка Full result set на закладке General, а на закладке Result Set давите кнопку Add и назначаете свою переменную.
7 окт 09, 12:01    [7752447]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
tpg, все точно так и сделала
Только от ошибки не могу избавиться.
[Execute SQL Task] Error: The result binding name must be set to zero for full result set and XML results.

Тип глобальной переменной должен быть STRING, если у меня тип поля в запросе - VARCHAR(...)?
Имя Result Name нужно менять? (по умолчанию NewResultName)
7 окт 09, 12:12    [7752528]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
REVelena
tpg, все точно так и сделала
Только от ошибки не могу избавиться.
[Execute SQL Task] Error: The result binding name must be set to zero for full result set and XML results.

Тип глобальной переменной должен быть STRING, если у меня тип поля в запросе - VARCHAR(...)?
Имя Result Name нужно менять? (по умолчанию NewResultName)
Это говорит о том, что в поле Result Name вместо "NewResultName" надо поставить ноль - "0".
А вот тип должен быть Object, независимо от типа возвращаемого столбца.
7 окт 09, 12:25    [7752640]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
tpg, Огромное спасибо. Очень-очень помогли.
Разобралась. Кто ж знал, что он хотел 0
7 окт 09, 12:27    [7752657]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
REVelena
Кто ж знал, что он хотел 0
Это документировано.
7 окт 09, 12:28    [7752665]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
tpg, последний вопрос.
Как мне эту переменную типа Object с результатом запроса теперь использовать? В FileDestination он позволяет подбирать только переменные типа String... Можно как-то преобразовать ее?
7 окт 09, 12:45    [7752788]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
REVelena
tpg, последний вопрос.
Как мне эту переменную типа Object с результатом запроса теперь использовать? В FileDestination он позволяет подбирать только переменные типа String... Можно как-то преобразовать ее?
А тут придется немного попотеть ;-), хотя - ничего сложного...
В File System Task заходите на закладку Expressions и давите на кнопку с троеточием в поле Misc. В открывшемся окне, в столбце свойств выбираете из списка Destination и опят давите кнопку с троеточием рядом со столбцом Expression - откроется построитель выражений в котором будут доступны и видимые в данной задаче переменные. Раскройте список переменных и выберете ту, которая будет замапленна на ваш рекордсет в контейнере цикла, перетащите её в поле Expression.
С помощью кнопки Evaluate Expression можно будет посмотреть текущее значение полученного вами выражения.

Т.о. вся задача свелась к тому, что полученный рекорсет используется в качестве значений имен целевых файлов, этот рекордсет обходится в цикле с маппингом на переменную, которая будет использована в выражении свойства задачи файловой системы в качестве имени целевого файла.
7 окт 09, 12:59    [7752914]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
Дошла до последнего пункта, когда
автор
С помощью кнопки Evaluate Expression можно будет посмотреть текущее значение полученного вами выражения

Получила ошибку
The data type of variable is not supported in an expression.
С той же ошибкой не дает закрывать окно Expression Builder :(
7 окт 09, 13:33    [7753235]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
REVelena
Дошла до последнего пункта, когда
автор
С помощью кнопки Evaluate Expression можно будет посмотреть текущее значение полученного вами выражения

Получила ошибку
The data type of variable is not supported in an expression.
С той же ошибкой не дает закрывать окно Expression Builder :(
Тэк-с...
Начнем с начала...
У вас в контейнере цикла на закладке Variables Mappings на какую переменную мап настроен?
Тут смысл какой... Контейнер цикла при каждой итерации считывает значение из нумератора (в вашем случае - из рекордсета) и присвоивает его замапленной переменной (соответственно, она должна быть в вашем случае строкового типа - в ней будет находится текущее для иттерации имя целевого файла). Затем значение уже этой переменной через выражение присваивается свойству Destination вашего приемника. И вот только после этого выполняется задача File System Task, т.е. происходит копирование.
При следующей иттерации контейнера происходит переход на следующее значение в списке (рекордсете) и далее всё повторяется.
Вот я и спрашиваю - у вас контейнер замаплен на переменную строкового типа или вы в построитель выражения File System Task пихаете переменную с самим рекордсетом?
7 окт 09, 13:49    [7753381]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
Все получилось(!!!!!!), правда не через File System Task, а по моему старому методу через ActiveX Script. Раньше не получалось, потому что в Variables Mappings не указала переменную типа String.
Через File System Task так и не получилось копировать, т.к. если в параметрах не указывать DestinationVariable, а указывать через Expressions, то получаем ошибку, что не указана переменная DestinationVariable. Если сразу туда записывать нужную переменную, то получаем ошибку о том, что она пуста.
Большое, огромное спасибо за помощь.
7 окт 09, 14:10    [7753555]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Упс...
Запутал я вас и сам запутался... Пардон!
Не надо использовать выражения в File System Task, достаточно и напрямую через переменную - на закладке General в строке IsDestinationPathVariable поставьте значение True, а в строке DestinationVariable назначте вашу замапленную к циклу переменную.
И никакого кода писать не надо.
7 окт 09, 14:27    [7753662]     Ответить | Цитировать Сообщить модератору
 Re: Глобальные переменные в DTS Пакетах  [new]
REVelena
Guest
tpg, все сделала, как написали. Все заработало!
В одиночку в этом разобраться нереально, по-моему. Хорошо, что есть такие отзывчивые люди :)
7 окт 09, 15:15    [7753991]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить