2011-07-06 19 views
7

Tôi có một thư mục trên mạng với các tệp và tôi đang di chuyển các tệp từ một thư mục sang một thư mục khác. Nhưng tôi chỉ muốn di chuyển các tệp mới, vì vậy chỉ sao chép các tệp không tồn tại trong thư mục đích. Làm sao? Tôi đã có vùng chứa vòng lặp for each và tác vụ của hệ thống tệp. Tôi đang sử dụng các biến. Ngay bây giờ nó sao chép tất cả các tệp từ một thư mục đến mỗi lần tiếp theo gói được thực thi. Có một số loại công cụ có điều kiện mà tôi có thể dính vào đó không? Tôi không thực sự giỏi viết kịch bản vì vậy nếu đó là giải pháp duy nhất tôi có thể cần sự giúp đỡ của bạn.Làm cách nào để chỉ lặp lại các tệp không tồn tại ở đích bằng gói SSIS?

Trả lời

11

Đây là một lựa chọn tốt mà bạn có thể đạt được điều này bằng Foreach Vòng container, Script nhiệm vụ hệ thốngfile nhiệm vụ. Ví dụ sau đây cho thấy cách này có thể được thực hiện. Ví dụ này được tạo bằng SSIS 2008 R2.

Step-by-step quá trình:

  1. Tạo hai thư mục có tên NguồnDestination trong đường dẫn C:\temp\ như trong ảnh chụp màn hình # 1 .

  2. Đặt một tệp mẫu có tên Sample_File_01.txt trong đường dẫn thư mục C:\temp\Source\ và rời khỏi thư mục khác trống. Gói SSIS sẽ sao chép các tệp từ thư mục Nguồn vào thư mục đích chỉ khi tệp đã không tồn tại. Tham khảo ảnh chụp màn hình # và # .

  3. Trên gói SSIS, tạo 7 biến như được hiển thị trong ảnh chụp màn hình # . Đặt biến DestinationFolder thành giá trị . Đặt biến SourceFolder thành giá trị C:\temp\Source\. Đặt biến FilePattern thành giá trị *.*. Bạn có thể thay đổi giá trị của các biến này theo yêu cầu của bạn.

  4. Chọn biến SourceFilePath và mở Properties cửa sổ bằng cách nhấn F4 nút. Thay đổi thuộc tính Đánh giáAsExpression đến True và đặt thuộc tính Biểu thức thành giá trị @[User::SourceFolder] + @[User::FileName]. Tham khảo ảnh chụp màn hình # .

  5. Chọn biến DestinationFilePath và mở Properties cửa sổ bằng cách nhấn F4 nút. Thay đổi thuộc tính Đánh giáAsExpression đến True và đặt thuộc tính Biểu thức thành giá trị @[User::DestinationFolder] + @[User::FileName]. Tham khảo ảnh chụp màn hình # .

  6. Trên gói của SSIS C ontrol dòng chảy tab, đặt một Foreach Loop container và cấu hình các thuộc tính của container như trong ảnh chụp màn hình # và # . Đảm bảo rằng bạn chọn nút radio Name and extension trên phần Bộ sưu tập.

  7. Trong vòng lặp Foreach Loop, đặt Script Task. Nhấp đúp vào tác vụ Tập lệnh và nhấp vào nút Edit Script. Thay thế phương thức Main() bên trong tác vụ kịch bản bằng mã được đưa ra theo phần Đoạn mã tác vụ kịch bản. Mã này kiểm tra xem tệp đích có tồn tại hay không và sau đó điền biến boolean DoesFileExist tương ứng.

  8. Trong vùng chứa Foreach Loop, đặt File System Task bên dưới Tác vụ tập lệnh. Kết nối mũi tên màu xanh lá cây thành công của tác vụ Tập lệnh với Tác vụ Hệ thống Tệp. Định cấu hình Tác vụ Hệ thống Tệp như được hiển thị trong ảnh chụp màn hình # .

  9. Chúng tôi cần tác vụ hệ thống tệp chỉ thực thi nếu tệp không tồn tại trong đường dẫn đích. Vì vậy, chúng ta cần thay đổi kết nối giữa Tác vụ Kịch bản và Tác vụ Hệ thống Tệp. Nhấp chuột phải vào trình kết nối màu xanh lục và chọn Chỉnh sửa như được hiển thị trong ảnh chụp màn hình # .

  10. Định cấu hình hạn chế quyền ưu tiên như được hiển thị trong ảnh chụp màn hình # . Điều này sẽ kiểm tra nếu biến DoesFileExist chứa giá trị False, có nghĩa là tệp không được tìm thấy trong đích.

  11. Sau khi được định cấu hình, gói SSIS sẽ giống như được hiển thị trong ảnh chụp màn hình # .

  12. Ảnh chụp màn hình # hiển thị trước tiên thực hiện gói. Trong quá trình thực thi này, không có tệp nào trong đường dẫn đích . Sau khi thực thi, tệp Sample_File_01.txt đã được sao chép từ C:\temp\Source\ đến .Tham khảo ảnh chụp màn hình # .

  13. Ảnh chụp màn hình # hiển thị giây thực hiện gói thứ hai. Trong quá trình thực hiện này, không có tệp nào được sao chép vào đường dẫn đích . Như bạn có thể thấy, rằng File System Task không thực thi vì ràng buộc Precedence thất bại.

Hy vọng điều đó sẽ hữu ích.

Script đang nhiệm vụ:

C# mã có thể được sử dụng chỉ trong SSIS 2008 and above.

Ảnh chụp màn hình # 2:

2

Ảnh chụp màn hình # 3:

3

Ảnh chụp màn hình # 4:

4

Ảnh chụp màn hình # 5:

5

Ảnh chụp màn hình # 6:

6

Ảnh chụp màn hình # 7:

7

Ảnh chụp màn hình # 8:

8

Ảnh chụp màn hình # 9:

9

Ảnh chụp màn hình # 10:

10

Ảnh chụp màn hình # 11:

11

Ảnh chụp màn hình # 12:

12

Ảnh chụp màn hình # 13:

13

Ảnh chụp màn hình # 14:

14

Ảnh chụp màn hình # 15:

15

+0

Thanks a lot Siva;) – largo68

1

Dưới đây là một giải pháp tiềm năng với hai giả định:

  1. Tất cả các file trong thư mục đích đã được chuyển bằng cách gói này.
  2. Tên tệp là duy nhất.

Bạn có thể thêm bước ghi nhật ký tên tệp vào ETL.

Tạo bảng nhật ký mới trong cơ sở dữ liệu với cột cho tên tệp. Trên mỗi vòng lặp của gói ghi tên tệp vào bảng này. Sau đó, bạn có thể sử dụng nó như một bảng tra cứu đơn giản được sử dụng bởi một số logic điều kiện trong ETL để kiểm tra xem tên tệp đang được xử lý có khớp với tệp hiện có hay không.

Chính xác cách bạn triển khai bước đăng nhập & kiểm tra có điều kiện (có thể là điều kiện trong luồng dữ liệu, được thực hiện trong tác vụ tập lệnh, v.v.) sẽ phụ thuộc vào thiết kế gói của bạn, nhưng nó sẽ hoàn thành những gì bạn đang tìm kiếm .

Các vấn đề liên quan