Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Добрый день!

Столкнулся с простой задачей на первый взгляд, но упёрся в использование переменной.
Задача - нужно каждую ночь перелить пару сотен тысяч записей из одной миллиардной таблицы в другую, но при этом нет даты, на которую можно опереться, но есть id. Целевая таблица обновляется каждую ночь на разное кол-во строк. Поэтому появилась идея сравнивать с максимальным, уже скопированным id. Получается, что вся цепочка пакета будет состоять из следующих шагов:

1) SQL Task в мою таблицу с поиском максимального id, занесение результата в глобальную переменную.
2) DataFlow, в котором нужно указать в запросе условие сравнения с этим id.

Настройка SQL Task:
General:
Result set - single row
коннекшн, директ инпут
Сам запрос - SELECT max(ID) as Value FROM [база].[dbo].[таблица]
Result set:
Value - User::Last_Record

Дальше дело за DataFlow,
прописываю коннекты, ставлю "откуда" и "куда" и дальше пишу следующий запрос:
автор
SELECT ID,
[куча нужных мне столбиков]
FROM [база].[dbo].[source_table]
WHERE (AMOUNT <> 0) AND (ID > ?)

,где вместо знака вопроса подставляется моя переменная в настройках - "Paramentrs":
Paramentrs - ?
Variables - User::Last_Record

По идеи должно всё работать, но условие не выполняется. Вместо "?" подставляется "0"
Переменная типа "Object", в свойствах стоит "Package", т.е. глобальная. Что может быть не так?

И ещё, хотел спросить.
Я тут не первый раз роюсь в поиске и частенько натыкался на скрины, где народ в скрипте выводил значение переменных. Я кодил в своё время на Delphi, поэтому со ScriptTask не особо дружу. Не подскажете, как минимально должен выглядеть код для проверки?

К сообщению приложен файл. Размер - 20Kb
25 окт 11, 15:42    [11496523]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
SELECT ID,
[куча нужных мне столбиков]
FROM [база].[dbo].[source_table]
WHERE (AMOUNT <> 0) AND (ID > ?)

У Вас там реально вместо имени параметра знак вопроса стоит?
25 окт 11, 16:10    [11496853]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Set Query Paramentrs
Paramentrs - ?
Variables - User::Last_Record

Если в параметрах его не указать, но он и не даст сохранить запрос.
Толи на микрософте, толи где-то тут, но вычитал,что именно так и надо. А на деле уже много как перепробовал.

Если в самом запросе попробовать написать переменную, то DataFlow потребует её объявить в самом запросе. Получается, что бы обратиться к переменной пакета, надо ставить знак "?" и указать ему соответствующее значение в параметрах.
25 окт 11, 16:37    [11497135]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Надо указать конкретное имя переменной для запроса и в Parameter Mapping привязать его к имени пакета.
25 окт 11, 16:57    [11497317]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Извините, оговорился. К имени переменной пакета.
25 окт 11, 17:00    [11497351]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Спасибо за интерес к теме.

Я - новичок в SSIS поэтому общаюсь с переменными первый раз, подскажите плз ещё 1 вопрос.
В Parameter Mapping у меня должно быть приблизительно следующее:

Variable Name - User::Last_Record
Direction - Input
Data Type - numeric (по умолчанию "Long")
Parameter Name - Value
Parameter Size - 19 (у меня столбец id : numeric 19,0 - то ли я указываю? )

Свойства Execute SQL Task
ResultSet - Single Row
ConnectionType - Ole DB
SQLSource - Direct input
SQLStatement - SELECT max(ID) as Value FROM [база].[dbo].[таблица]
ByPassPrepare - False

ResultSet:
Paramentrs - Value
Variables - User::Last_Record

Выдаёт ошибку:
автор
[Execute SQL Task] Error: Executing the query "SELECT max(FinancialtransactionID) as Value FROM [..." failed with the following error: "Parameter name is unrecognized.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Что в настройках результата не так? =/

Ниже скрин DataFlow

К сообщению приложен файл. Размер - 55Kb
25 окт 11, 17:44    [11497837]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Извините, если не понял. Вы используете Data Flow Task чтобы получить одно значение?
25 окт 11, 18:06    [11498066]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
И я бы рекомендовал ещё следующее. Используйте ADO.NET вместо OLE DB. Вам не придётся иметь дело с ошибками преобразований типов OLE DB и SQl Server, и не надо будет в тексте команды описывать переменные T-SQL. Достаточно их указать в Parameter Mapping и они будут видны в команде.
25 окт 11, 18:23    [11498181]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Нееееееее.
Для этого я использую Execute SQL Task, который находит максимальный id в моей таблице и передаёт его в DataFlow через глобальную переменную, а там уже выполняется запрос, который копирует все записи из целевой таблицы, внесённые после этого id.
Т.к. почти никогда не пользовался SSIS, у меня возникли проблемы с использованием переменных. По описаню из анг. книги по SQL2005, вроде бы уже и расставил всё по своим местам, но натыкаюсь на ошибки =/ Вот и спрашиваю.
25 окт 11, 18:26    [11498205]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Ага, теперь понятно. У меня заработало, когда я вместо OLE DB провайдера использовал SQL Server Native Client.
25 окт 11, 18:39    [11498289]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
И меня смущает, что на вкладке Set Query Parameter в столбце Parameters стоит знак вопроса. У меня автоматом добавило Parameter0 и всё работает. Кстати и с OLE DB Provider тоже.
25 окт 11, 18:42    [11498309]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Jovanny
У меня автоматом добавило Parameter0 и всё работает.

А в самом коде запроса Вы что подставляли?
26 окт 11, 09:53    [11500104]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Знак вопроса. С OLE DB не работал, но вполне возможно, знаки вопроса по порядку заменяет на Parameter0, Parameter1 и т.д.
26 окт 11, 10:04    [11500182]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: Использование переменной между Execute SQL Task и Data Flow  [new]
DenLaDenPro
Member

Откуда: Москва
Сообщений: 18
Jovanny
Ага, теперь понятно. У меня заработало, когда я вместо OLE DB провайдера использовал SQL Server Native Client.

А у меня нет такого =)

@@VERSION
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2) (VM)


У меня 6 вариантов :
Excel / OLEDB / ODBC / ADO / ADO.net / SQL.Mobile

Спасибо за интересную мысль, как только освободят сервак - обязательно попробую.
26 окт 11, 16:18    [11504147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить