Подтвердить что ты не робот

Как переместить файлы в папку архива после того, как файлы были обработаны?

Я пытаюсь архивировать набор файлов из исходного пути в путь к архиву, как только я закончил выполнение некоторых элементов задачи потока данных. Внутри контейнера Loop Container у меня есть: Script Задача → Задача потока данных → Выполнение задачи SQL → Задача файловой системы

У меня есть переменная пользователя, установленная в элементе "Имя и расширение" в настройках коллекции в контейнере циклов Foreach. Эта переменная называется "имя_файла" и используется как в задаче Script (используется для анализа информации из файла и выполнения задачи SQL Execute), так и в задаче потока данных в диспетчере соединений с плоскими файлами, которая, в свою очередь, используемый элементом Flat File Source. Затем я разбираю файл и вставляю данные в базу данных. Все работает так, как должно, пока не дойду до задачи файловой системы (FST).

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

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

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

4b9b3361

Ответ 1

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

Шаг за шагом:

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

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

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

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

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

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

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

  • На вкладке "Управление потоком" поместите Foreach Loop container, Data Flow Task и File System Task, как показано на снимке экрана 17.

  • Настройте контейнер Foreach Loop, как показано на скриншотах # 18 - # 19.

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

  • Настройте источник плоского файла, как показано на скриншотах # 21 и # 22. Это будет читать данные из CSV файлов.

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

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

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

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

  • Скриншоты # 29 и # 30 демонстрируют выполнение пакетов внутри вкладок Flow Flow и Data Flow.

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

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

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

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

Сценарии 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:

<Т411 >

Снимок экрана № 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