Есть ли способ выполнить код T-SQL внутри потока данных в SSIS?

Фон

У меня есть таблица измерений, в которой есть одна запись на каждый день. Каждая запись имеет первичный ключ, поэтому пример данных будет таким:

Dimension Table
---------------

---------------------------------
| ID   | DateTime               |
---------------------------------
| 1083 | 04/10/2008 10:02:00 PM |
---------------------------------

Что я пытаюсь сделать, так это взять столбец исходных данных, который имеет значение даты и времени SQL (например, 04/10/2008 10:02:00 PM), и заставить SSIS получить то, каким должен быть первичный ключ из таблицы измерений (1083 в приведенном выше примере). Я пытаюсь вписать это в поток данных в моем пакете и избегать использования промежуточных таблиц.

Я хотел бы вызвать функцию базы данных во время моего потока данных, чтобы мой пакет SSIS обнаружил timeid для записи datetime. Я пытался использовать DeriveColumn, но, похоже, это не позволяет использовать T-SQL; скорее только функции, встроенные в ANSI SQL.

Вопрос

Есть ли другой способ сделать это внутри потока данных? Или мне нужно будет использовать промежуточные таблицы и использовать SQLTask вне потока данных для управления моими данными?


person rrydman    schedule 08.05.2009    source источник
comment
Что такое timeid для записи даты и времени?   -  person Tom H    schedule 08.05.2009
comment
Извините, я должен был объяснить это более подробно. У меня есть таблица измерений, в которой есть одна запись на каждый день. Каждая запись имеет первичный ключ, поэтому скажем, 10 марта 2008 г., равный первичному ключу 1083. Я пытаюсь взять столбец исходных данных, который имеет значение даты и времени SQL (например, 22:02, 10 марта 2008 г.) и получить SSIS. каким должен быть первичный ключ из таблицы измерений (1083 в приведенном выше примере). Я пытаюсь вписать это в поток данных в моем пакете и избегать использования промежуточных таблиц.   -  person rrydman    schedule 08.05.2009


Ответы (1)


Насколько я вас понимаю, у вас есть витрина данных с измерением времени, и вам нужно получить timeId, соответствующий определенному времени.

Если это так, то вы хотите использовать компонент поиска. Для справочной таблицы используйте что-то вроде SELECT timeId, timeStamp FROM TimeDimension, затем найдите входной столбец, содержащий отметку времени. Используйте timeId в качестве выходного столбца, и теперь каждая строка в вашем потоке данных будет иметь timeId, соответствующий ее метке времени.

person John Saunders    schedule 08.05.2009
comment
Спасибо за ответ! Я считаю, что это правильное направление, однако у меня проблемы с его работой. Записи меток времени в моем TimeDimension являются полуночными записями (02.12.2008, 00:00), тогда как записи времени в моих исходных данных являются точными записями (26.10.2008, 18:40:46). Как я могу заставить функцию поиска избежать времени? Я предполагаю компонент нечеткого поиска, но у меня возникают проблемы с его работой. Спасибо! - person rrydman; 08.05.2009
comment
Когда вы создаете запрос для исходного компонента, сделайте один столбец округленной временной меткой: DATEADD(DAY, DATEDIFF(DAY, 0, timestamp), 0) - person John Saunders; 08.05.2009
comment
Я пытаюсь использовать это в компоненте производного столбца, и я получаю сообщение об ошибке, которое не могу понять. Я беру исходный столбец и вывожу его в новый столбец с помощью следующей функции: DATEADD(DAY, DATEDIFF(DAY, 0, [createDateTime]), 0). Ошибка, которую я получаю, выглядит следующим образом: Функция DATEDIFF не поддерживает тип данных DT_I4 для параметра номер 2. Тип параметра не может быть неявно преобразован в совместимый тип для функции. Чтобы выполнить эту операцию, операнд должен быть явно приведен с помощью оператора приведения. Он отлично работает в запросе... O.o - person rrydman; 08.05.2009
comment
Извините, я не был ясен. Я хотел, чтобы вы использовали это выражение в операторе SELECT, который создает входные строки. Я полагаю, что если вы просто используете таблицу, вы застряли бы с производным столбцом. Похоже, DATEADD(DD,DATEDIFF(DD,(DT_DATE)1/1/1900,отметка времени),(DT_DATE)1/1/1900) будет работать. - person John Saunders; 08.05.2009
comment
Это сработало! Ты молодец :-) Могу я пораскинуть мозгами о том, как я мог бы сделать тот же процесс только для времени, а не для даты? У меня есть таблица DimTime с записью на каждую секунду дня. В нем есть столбец со стандартным временем (например: 00:03:23), поэтому, если бы я мог удалить часть даты из отметки даты и времени, я мог бы выполнить аналогичный поиск значения времени и найти идентификатор для записи времени. - person rrydman; 09.05.2009
comment
Сделайте то же самое, но подставьте секунды вместо ДЕНЬ. Это работает для любой детализации даты, поддерживаемой DATEADD, DATEPART, DATEDIFF и т. д. - person John Saunders; 09.05.2009