2017-02-21 17 views
6

Tôi có một truy vấn SQL đang được thực hiện trong SSIS để tải dữ liệu vào một tập tin CSV mà trông giống như sau:Tôi có thể đặt các biến trong SSIS cho vòng lặp dựa trên truy vấn không?

SELECT * 
FROM SomeTable 
WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Dec-2016' 
     AND Param1 = 2 AND Param2 = 2 

Khi điều này được viết bằng QlikView, tôi sử dụng các thông số như sau:

SELECT * 
FROM SomeTable 
WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Dec-2016' 
     AND Param1 = $(Param1) AND Param2 = $(Param2) 

Bây giờ tôi đang di chuyển toàn bộ nhiệm vụ sang SSIS, tôi đang tìm cách để có được nó như vậy mà Param1 và Param2 sẽ được gán động. Ví dụ: trong QlikView, tôi đã tạo một bảng được điền bởi một truy vấn khác:

SELECT Param1, Param2 
FROM ThisTable 
WHERE SomeID = 1 

Điều gì đó tương tự. Việc chọn Param1Param2 từ truy vấn đó mang lại cho tôi các giá trị cần thiết cho $(Param1)$(Param2) trong mã QlikView của tôi.

Tôi hiện đang cố chuyển đổi mã QlikView thành gói SSIS thay vì SSIS là công cụ ETL chuyên dụng trong khi QlikView thì không. Là những gì tôi đang làm có thể? Và nếu có, tôi sẽ làm thế nào?

Ý tưởng của tôi là để quấn nó tất cả trong một container vòng lặp và có nó dừng lại sau khi nó grabs cuối cùng Param1Param2 từ truy vấn này:

SELECT Param1, Param2 
FROM ThisTable 
WHERE SomeID = 1 

Về cơ bản, tôi đang cố gắng để tránh phải viết câu lệnh chọn đầu tiên của tôi hàng nghìn lần.

Cảm ơn bạn.

Nếu những gì tôi nói không hợp lý, hãy cho tôi biết để tôi có thể xây dựng thêm một chút.

Trả lời

7

Tôi nghi ngờ rằng bạn đang thực hiện một nhiệm vụ SQL, do đó, bạn chỉ có thể ánh xạ các tham số trong thành phần SQL Task.

Những gì bạn sẽ phải làm là để tạo một phần SQL thực hiện truy vấn này:

SELECT Param1, Param2 
FROM ThisTable 
WHERE SomeID = 1; 

Tôi đã chế giễu sqlStatement lên, nhưng mọi thứ khác sẽ giống như thế đó (đừng quên kiểm tra xem nó có một bộ dữ liệu đầy đủ): enter image description here

Sau đó đưa kết quả đặt vào một biến đối tượng (chỉ cần đảm bảo để quả từ tên chính thức 0): enter image description here

Bây giờ trong để chạy truy vấn sau cho mỗi giá trị, được thu thập ở trên, chúng ta có thể sử dụng vòng lặp foreach và lặp qua tập dữ liệu của mình. Trong vòng lặp foreach này, chúng ta sẽ đặt một luồng dữ liệu nhiệm vụ, nơi bạn sẽ sử dụng OLE DB như một nguồn và tệp phẳng làm đích để đọc dữ liệu và đặt nó vào tệp csv. (Trong dự án thực sự tôi muốn tư vấn để sử dụng ODBC thay vì OLE DB, nó nhanh hơn).

tính

Loop: enter image description here

biến Gán trong vòng lặp foreach: enter image description here

Bây giờ trong nhiệm vụ dataflow tạo nguồn dữ liệu của bạn, thêm truy vấn và parameterize nó như thế: enter image description here enter image description here

Cuối cùng, nó sẽ trông giống như thế (những gì được đánh dấu màu đỏ là các thành phần bên trong của luồng dữ liệu): enter image description here

Tất nhiên bạn sẽ phải thêm một số ghi nhật ký hoặc một số thành phần khác, nhưng điều này là cơ bản và sẽ giúp bạn di chuyển.

+0

tôi đang thực sự sử dụng Data Flow Tác vụ chứa nguồn OLE DB -> Tệp đích phẳng. Phương pháp của bạn có cho phép tôi lưu tập hợp kết quả thành CSV không? – Leon

+0

Vâng, đúng vậy. Tôi sẽ sửa đổi câu trả lời của mình để được chi tiết hơn –

+0

@Leon được cập nhật. Hy vọng rằng nó chi tiết hơn bây giờ :) –

0

Bạn cũng có thể những gì để nhìn vào các công cụ SSIS "Đối với Vòng Container" và "Foreach Vòng

Bạn điền vào một loại Parameter Object với một danh sách các giá trị -. Trong trường hợp của tôi, tôi sử dụng một truy vấn trong SQL nhiệm vụ [Lookup thiếu Orders] và sau đó [Foreach tự Vòng] nhiệm vụ đi qua mỗi mục trong tham số và thực thi [thiếu tải Orders] luồng dữ liệu nhiệm vụ:.

enter image description here

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