Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Yagrus2 Member Откуда: Москва Сообщений: 902 |
Hello world! Стоит задача разбивать данные таблицы-источника по годам и класть их в соответствующие таблицы-назначения. Например, за 2018 год данные должны попасть в T_2018, а за 2017 в T_2017. Подскажите, возможно ли это сделать используя data flow task и его expressions? |
28 ноя 18, 17:59 [21747732] Ответить | Цитировать Сообщить модератору |
aleks222 Member [заблокирован] Откуда: Сообщений: 1243 |
Религиозные убеждения не дозволяют использовать insert select? |
||
28 ноя 18, 18:02 [21747739] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
28 ноя 18, 19:10 [21747816] Ответить | Цитировать Сообщить модератору |
Ferdipux Member Откуда: Москва Сообщений: 584 |
Можно и без Expressions. Делаете в Data Flow источник - SQL from variable для выборки данных определенного года, получатель данных - Table name from variable, и в цикле крутите заполнение таблиц, модифицируя переменные через Expression. Или как alexeyvg выше предлагал - через Conditional Split. |
||
29 ноя 18, 11:45 [21748303] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
Автору destination менять нужно, а не source. Yagrus2, Если список получателей динамический, используйте Script Component в качестве destination. Если фиксированный, то, как уже говорили выше, Conditional Split |
||||
29 ноя 18, 13:54 [21748549] Ответить | Цитировать Сообщить модератору |
Ferdipux Member Откуда: Москва Сообщений: 584 |
Если таблицы имеют одинаковый набор колонок, их названия и тип - то вполне работает метод с именем таблицы из переменной в OLE DB Destination. Попроще будет чем программировать Script Destination, динамику тоже поддерживает. |
||
29 ноя 18, 14:29 [21748618] Ответить | Цитировать Сообщить модератору |
Yagrus2 Member Откуда: Москва Сообщений: 902 |
Ferdipux, Решил попробовать реализовать через SQL from variable Для этого использую Execute SQL Task, чтобы заполнить соответствующие переменные:
sQuarter --> sQuarterList iQuarter --> iQuarterList Работа пакета завершается ошибкой . [Execute SQL Task] Error: There is an invalid number of result bindings returned for the ResultSetType: "ResultSetType_Rowset". Подскажите, что нужно поменять в настройках? p.s. - Если запрос возвращает один столбец, то на вкладке Result Set, для Result Name нужно указать 0. |
||||||||||||||||||
29 ноя 18, 15:51 [21748784] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
По моему, вы не понимаете, в чём задача :-) Таким способом можно перебрать OLE DB Destination в цикле, но тогда придётся делать исходную выборрку столько раз, сколько будет разных OLE DB Destination, что неэффективно Так зачем замедлять, если есть специально предназначенный для разделения потока данных Conditional Split? |
||||
29 ноя 18, 16:09 [21748813] Ответить | Цитировать Сообщить модератору |
Glebanski Member Откуда: Msk ->NL Сообщений: 319 |
А почему никто не предлагает сделать partitioned view, под ним таблицы с Constraints на даты? Тогда destination вообще один будет, а все записи поза вас сервер по таблицам раскидает. |
29 ноя 18, 21:23 [21749115] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Единственно, балк инсёрт при этом невозможен, производительность Data Flow task резко упадёт, и, соответственно, применимость такого решения зависит от объёмов данных. |
||
30 ноя 18, 10:25 [21749515] Ответить | Цитировать Сообщить модератору |
Ferdipux Member Откуда: Москва Сообщений: 584 |
Yagrus2, Вам для получения результатов запроса нужно использовать только 1 переменную типа Object. Если Connection manager типа OLEDB - смаппить эту переменную на элемент 0. |
30 ноя 18, 11:11 [21749636] Ответить | Цитировать Сообщить модератору |
Yagrus2 Member Откуда: Москва Сообщений: 902 |
Я так и делаю. Захотелось поэкспериментировать и инициализировать две переменных. Каждая с типом Object. Но не вышло, получил ошибку: [Execute SQL Task] Error: There is an invalid number of result bindings returned for the ResultSetType: "ResultSetType_Rowset". Всегда должна быть одна переменная? |
||
30 ноя 18, 12:15 [21749770] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Так нельзя, да, всегда должна быть только одна переменная. |
||
30 ноя 18, 14:08 [21749981] Ответить | Цитировать Сообщить модератору |
Yagrus2 Member Откуда: Москва Сообщений: 902 |
alexeyvg, Нет. Запрос возвращает два столбца. Каждый столбец хотел бы положить в свою переменную типа Object |
30 ноя 18, 15:26 [21750152] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Да и зачем это нужно, ну, будет 2 коллекции с записями, вместо одной, это же неудобно, как сопроставлять записи? |
||
30 ноя 18, 15:35 [21750186] Ответить | Цитировать Сообщить модератору |
Yagrus2 Member Откуда: Москва Сообщений: 902 |
А для чего тогда есть возможность создавать несколько отношений между Rowset - ом и переменными? К сообщению приложен файл. Размер - 45Kb |
||
3 дек 18, 14:02 [21752038] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
Yagrus2, SQL выражение может вернуть несколько наборов данных. При этом для каждого можно определить свою переменную-объект. |
3 дек 18, 15:30 [21752170] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
В частности: "If the result set type is Full result set or XML, you must use 0 as the result set name." А возможность создавать несколько отношений между Rowset - ом и переменными предназначена для другого типа возврата - Single row В этом случае в каждую переменную записывается значение из первой строки рекордсета, из колонки, имя которой указано в Relult Name Это всё тоже описано в том же хелпе, с примерами, как потом использовать результаты.
"If the Execute SQL task uses the Full result set result set and the query returns multiple rowsets, the task returns only the first rowset. If this rowset generates an error, the task reports the error. If other rowsets generate errors, the task does not report them." |
||||||
3 дек 18, 17:34 [21752292] Ответить | Цитировать Сообщить модератору |
Glebanski Member Откуда: Msk ->NL Сообщений: 319 |
Весь рассказ выглядит как-то сомнительно с бизнес-точки зрения. ИМХО конечно.
Задача- разбить или разбивать? Источника или источников? Если у вас есть таблица-источник с данными за 2017, то сколько раз вы ее "переложите" в другую? Данные за 2017 уже не станут внезапно данными за 2016, не так ли. Их достаточно ведь переложить один раз? А данные за 2018. Вы же не собираетесь каждый день копировать данные за январь 2018? Они же уже находятся в T_2018? Я к тому, что если процедура однократная, то и нечего городить сложные коды. Данные можно условно говоря и на флешке перенести. Уж те, что до 01-01-2018 точно. Написать можно и супер-корявый код, запустить его один раз и забыть. А если это ежедневный процесс, то у вас и таргет почти всегда один - T_Номер_Текущего_год. Вы же не делаете "delete from T_2018", перед там все заново "класть". Если это так, то можно по идее - Set "Data access mode" to "Table name or view name variable - fast load" - Set the variable name to User::TargetTable, где TargetTable выставлять через параметр при запуске. Ну и чтоб совсем безопасно, MERGE вместо INSERT использовать. Как-то так... |
||
3 дек 18, 17:37 [21752299] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
alexeyvg, давно не брал в руки шашки, но, насколько я помню, для разных драйверов по-разному. Для OLE DB они нумеруются с нуля и дальше. Рекордсет номер 2 будет иметь номер 1 и так далее. |
3 дек 18, 17:38 [21752300] Ответить | Цитировать Сообщить модератору |
Ferdipux Member Откуда: Москва Сообщений: 584 |
Это вы путаете колонки и рекордсеты. Для OLEDB - колонки имеют номера, начиная с 0, для ADO.NET - можно использовать имена. Как утверждает документация Microsoft, в Execute SQL Task всегда возвращается только первый рекордсет. |
||
3 дек 18, 18:49 [21752359] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Значит, всё таки несколько рекордсетов использовать нельзя :-( Жаль, всё таки принцип наличия нескольких рекордсетов - фишка, выгодно выделявшая сиквел, но почему то нельзя это использовапть как внутри сиквела, так и в миерософтовких клиентах, типа SSIS или SSRS. |
||||
3 дек 18, 20:32 [21752411] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 768 |
|
||
4 дек 18, 09:24 [21752603] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
Я бы не долго думая сделал бы сразу кучу потов от 2015 до 2035 года и прописал бы все назначения. Можно даже сгенерить пакет и таблицы кодом, если таких потов много. |
||
4 дек 18, 12:31 [21752768] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
Yagrus2, А вообще есть партиционирование |
4 дек 18, 12:31 [21752771] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |