Как переместить файлы в папку архива после обработки файлов? - PullRequest
15 голосов
/ 14 июля 2011

Я пытаюсь заархивировать набор файлов от исходного пути до пути к архиву после того, как я выполнил некоторые элементы Задачи потока данных. Внутри контейнера Петли Foreach у меня есть: Задача сценария -> Задача потока данных -> Задача «Выполнить SQL» -> Задача файловой системы

У меня есть переменная User, настроенная на элемент «Имя и расширение» в настройках Collection в контейнере циклов Foreach. Переменная называется «fileName» и используется как в задаче «Сценарий» (используется для анализа информации из файла и выполнения задачи «Выполнение SQL»), так и в задаче «Поток данных» в диспетчере соединений с плоскими файлами, который, в свою очередь, используется элемент «Плоский файл». Затем я анализирую файл и вставляю данные в базу данных. Все работает как надо, пока я не доберусь до задачи файловой системы (FST).

Я хотел бы, чтобы файл был перемещен в папку архива после завершения его вставки. Используя несколько ссылок онлайн ( здесь , здесь и здесь ), я добавил различные переменные, которые жестко запрограммированы или получены из массирования других переменных. В любом случае происходит то, что на FST я получаю ошибки, такие как «недопустимые символы в пути» или «неизвестный путь». Если я попытаюсь объединить приведенные выше примеры, чтобы они соответствовали структуре моей файловой системы, я теперь получаю сообщение об ошибке на шаге «Плоский файл» в задаче «Поток данных», в котором говорится, что не удается найти указанный файл. Это вызвано тем, что это а) не может найти путь к файлу, потому что путь к файлу не указан, только имя_файла.ext б) не может проанализировать переменную, которая содержит полный путь к исходному файлу (@FullSourcePathFileName, значение которого установлено на @[User::SourcePath] + @[User::fileName])

Я протестировал другие различные модификации, включая выполнение именно того, что было в первом примере, который я опубликовал (однако на самом деле он ничего не делает с задачей потока данных, поэтому я просто добавил шаг источника плоских файлов без назначения) и получил то же самое множество ошибок. Я в недоумении и хотел бы узнать, как решить эту проблему.

EDIT: Кажется, что он продолжает работать на FullArchivePathFileName - он никогда не оценивает выражение, даже если у меня установлено значение «True». Все еще не понимают, почему он не оценивает его. Поэтому я сделал его выражение таким же, как FullSourcePathFileName, и проверил, что для флага EvaluateAsExpression установлено значение True. Он по-прежнему не оценивает эту переменную. Переменная FullSourcePathFileName оценивается очень хорошо.

1 Ответ

62 голосов
/ 15 июля 2011

Следующий пример, созданный в SSIS 2005, читает файлы CSV из заданной папки и вставляет данные в таблицу SQL.После импорта данных в SQL файлы затем перемещаются в папку архива с помощью задачи «Файловая система».

Пошаговый процесс:

  1. Создать папку с именем Archive в пути C: \ temp.Создайте два файла CSV с именами File_1.csv и File_2.csv и заполните их данными.Оставьте папку архива пустой.Смотрите скриншоты # 1 - # 4 .

  2. В пакете служб SSIS создайте 5 переменных, как показано на скриншоте # 5 .Установите переменную RootFolder со значением C:\temp\.Установите переменную FilePattern со значением *.csv.

  3. Выберите переменную FilePath и нажмите F4, чтобы открыть свойства, измените свойство EvaluateAsExpression на True и установите свойство Expression со значением @[User::RootFolder] + @[User::FileName], как показано вснимок экрана # 6 .

  4. Выберите переменную ArchiveFolder и нажмите F4, чтобы открыть свойства, измените свойство EvaluateAsExpression на True и установитеСвойство выражения со значением @[User::RootFolder] + "Archive\\", как показано на скриншоте # 7 .

  5. В диспетчере соединений пакета служб SSIS создайте новое соединение с плоским файлом с именем CSV.Смотрите скриншот # 8 .Настройте соединение с плоским файлом, как показано на скриншотах # 9 - # 13 .Кроме того, создайте соединение OLE DB с именем SQLServer для подключения к базе данных SQL Server.После создания подключения оно должно выглядеть, как показано на скриншоте # 14 .

  6. Щелкните правой кнопкой мыши CSV-соединение с плоским файлом, выберите свойства и настройте выражение ConnectionString.со значением @ [User :: FilePath] с помощью кнопки с многоточием, как показано на скриншотах # 15 - # 16 .

  7. Создать таблицус именем dbo.Items в SQL Server с использованием сценариев, предоставленных в разделе SQL Scripts .Данные CSV-файлов будут вставлены в эту таблицу.

  8. На вкладке Поток управления поместите Foreach Loop container, Data Flow Task и File System Task, как показано на скриншоте # 17 .

  9. Настройте контейнер цикла по каждому элементу, как показано на снимках экрана # 18 - # 19 .

  10. Внутри задачи потока данных поместите источник плоских файлов, преобразование производного столбца и назначение OLE DB, как показано на скриншоте # 20 .

  11. Настройте источник плоского файла, как показано на скриншотах # 21 и # 22 * ​​1109 *.При этом будут считаны данные из файлов CSV.

  12. Настройте преобразование «Производный столбец», как показано на скриншоте # 23 .Это используется для создания значения столбца FilePath с использованием переменной с тем же именем.

  13. Настройте назначение OLE DB, как показано на снимках экрана # 24 и @ 25 .Это вставит данные в таблицу SQL.

  14. На вкладке «Поток управления» настройте задачу файловой системы, как показано на снимке экрана # 26 .Обратите внимание, что во время операции Переместить файл , DestinationVariable можно указывать только как каталог, а не как полный путь к файлу.Если вы укажете путь к файлу, вы получите сообщение об ошибке [File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.".

  15. Снимок экрана # 28 показывает, что данные отсутствуюттаблица перед выполнением пакета.

  16. Снимки экрана # 29 и # 30 показывают выполнение пакета на вкладках Поток управления и Поток данных.

  17. Снимки экрана # 31 и # 32 показывают, что файлы были перемещены в папку архива.

  18. Снимок экрана # 33 показывает данные в таблице после выполнения пакета.

  19. В задаче «Файловая система» свойство OverwriteDestination было установлено на False (это значение по умолчанию).Если вы перемещаете файлы с одинаковыми именами в папку «Архив», вы получите ошибку [File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. "., показанную на скриншоте # 34 .Чтобы избежать этого, установите для параметра OverwriteDestination значение True или другой вариант - переименовать файлы и скопировать их в папку «Архив», а затем удалить их.

Надеюсь, это поможет.

Сценарии SQL:

CREATE TABLE [dbo].[Items](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [varchar](30) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
    [FilePath] [varchar](255) NOT NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

Снимок экрана № 1:

1

Снимок экрана № 2:

2

Снимок экрана № 3:

3

Снимок экрана № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Снимок экрана № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

Снимок экрана № 15:

15

Снимок экрана № 16:

16

Снимок экрана № 17:

17

Снимок экрана № 18:

18

Снимок экрана № 19:

19

Снимок экрана № 20:

20

Снимок экрана № 21:

21

Снимок экрана № 22:

22

Снимок экрана № 23:

23

Снимок экрана № 24:

24

Снимок экрана № 25:

25

Снимок экрана № 26:

26

Снимок экрана № 27:

27

Снимок экрана № 28:

28

Снимок экрана № 29:

29

Снимок экрана № 30:

30

Снимок экрана № 31:

31

Снимок экрана № 32:

32

Снимок экрана № 33:

33

Снимок экрана № 34:

34

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