Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để chuyển giá trị cho một tham số thủ tục được lưu trữ trong thành phần Nguồn OLE DB?

Về mặt khái niệm, giải pháp của bạn sẽ trông như thế nào là thực thi truy vấn nguồn của bạn để tạo tập kết quả của bạn. Lưu trữ giá trị đó vào một biến và sau đó bạn sẽ cần lặp lại các kết quả đó và đối với mỗi hàng, bạn sẽ muốn gọi thủ tục đã lưu trữ của mình với giá trị của hàng đó và gửi kết quả vào một tệp Excel mới.

Tôi hình dung gói hàng của bạn trông giống như thế này

Tác vụ SQL thực thi, có tên là "Tập hợp bản ghi tải SQL", được đính kèm với Bộ chứa vòng lặp Foreach, có tên "Tập bản ghi cắt nhỏ FELC". Được lồng bên trong đó, tôi có Nhiệm vụ hệ thống tệp, có tên "Mẫu sao chép FST", ưu tiên cho Tác vụ luồng dữ liệu, có tên "DFT tạo đầu ra".

Thiết lập

Vì bạn là người mới bắt đầu, tôi sẽ cố gắng giải thích chi tiết. Để đỡ rắc rối cho chính mình, hãy lấy một bản sao của BIDSHelper. Đó là một công cụ mã nguồn mở, miễn phí giúp cải thiện trải nghiệm thiết kế trong BIDS / SSDT.

Các biến

Nhấp vào nền của Quy trình kiểm soát của bạn. Không có gì được chọn, nhấp chuột phải và chọn Biến. Trong cửa sổ mới bật lên, hãy nhấp vào nút tạo Biến mới 4 lần. Lý do cho việc nhấp vào không có gì là cho đến SQL Server 2012, hành vi mặc định của việc tạo biến là tạo chúng ở phạm vi của đối tượng hiện tại. Điều này đã dẫn đến nhiều sợi tóc bị mất đối với các nhà phát triển mới và có kinh nghiệm. Tên biến có phân biệt chữ hoa chữ thường, vì vậy hãy lưu ý điều đó.

  1. Đổi tên Biến thành RecordSet. Thay đổi kiểu dữ liệu từ Int32 thành Đối tượng
  2. Đổi tên Variable1 thành ParameterValue. Thay đổi kiểu dữ liệu từ Int32 thành Chuỗi
  3. Đổi tên Variable2 thành TemplateFile. Thay đổi kiểu dữ liệu từ Int32 thành Chuỗi. Đặt giá trị cho đường dẫn của Tệp Excel đầu ra của bạn. Tôi đã sử dụng C:\ ssisdata \ ShredRecordset.xlsx
  4. Đổi tên Biến 4 thành OutputFileName. Thay đổi kiểu dữ liệu từ Int32 thành Chuỗi. Ở đây chúng tôi sẽ làm một cái gì đó hơi nâng cao. Nhấp vào biến và nhấn F4 để mở cửa sổ Thuộc tính. Thay đổi giá trị của AssessAsExpression thành True. Trong Biểu thức, đặt nó thành "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (hoặc bất kỳ tệp và đường dẫn nào của bạn). Điều này thực hiện, là cấu hình một biến để thay đổi khi giá trị của ParameterValue thay đổi. Điều này giúp đảm bảo chúng tôi nhận được một tên tệp duy nhất. Bạn có thể thay đổi quy ước đặt tên nếu cần. Lưu ý rằng bạn cần thoát khỏi \ bất cứ lúc nào bạn đang ở trong một biểu thức.

Trình quản lý kết nối

Tôi đã giả định rằng bạn đang sử dụng trình quản lý kết nối OLE DB. Của tôi có tên là FOO. Nếu bạn đang sử dụng ADO.NET, các khái niệm sẽ tương tự nhưng sẽ có những sắc thái liên quan đến các tham số và những điều tương tự.

Bạn cũng sẽ cần một Trình quản lý kết nối thứ hai để xử lý Excel. Nếu SSIS thất thường về các kiểu dữ liệu, thì Excel sẽ làm rối loạn tâm lý của bạn khi bạn đang ngủ về các kiểu dữ liệu. Chúng tôi sẽ đợi và để luồng dữ liệu thực sự tạo Trình quản lý kết nối này để đảm bảo các loại của chúng tôi hoạt động tốt.

Truy vấn nguồn đến tập hợp kết quả

SQL Load Recordset là một ví dụ của Nhiệm vụ SQL Thực thi. Ở đây tôi có một truy vấn đơn giản để bắt chước nguồn của bạn.

SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'

Điều quan trọng cần lưu ý trên tab Chung là tôi đã chuyển Tập kết quả của mình từ None thành Full result set . Làm điều này làm cho tab Tập hợp kết quả chuyển từ màu xám sang có thể sử dụng được.

Bạn có thể thấy rằng tôi đã gán Tên biến cho biến mà chúng ta đã tạo ở trên (User ::RecordSet) và Tôi Tên Kết quả là 0 . Điều đó quan trọng như giá trị mặc định, NewResultName không hoạt động.

FELC Shred Recordset

Lấy Vùng chứa vòng lặp Foreach và chúng tôi sẽ sử dụng điều đó để "cắt nhỏ" các kết quả đã được tạo ở bước trước.

Định cấu hình điều tra viên làm Foreach ADO Enumerator Sử dụng User::RecordSet dưới dạng biến nguồn đối tượng ADO của bạn. Chọn các hàng rows in the first table làm chế độ Đăng ký của bạn

Trên tab Ánh xạ biến, bạn sẽ cần chọn biến User::ParameterValue của mình và gán cho nó Chỉ số bằng 0. Điều này sẽ dẫn đến phần tử zerotth trong đối tượng tập bản ghi của bạn được gán cho biến ParameterValue. Điều quan trọng là bạn phải có thỏa thuận về loại dữ liệu vì SSIS sẽ không thực hiện các chuyển đổi ngầm ở đây.

Mẫu sao chép FST

Đây là một Nhiệm vụ Hệ thống Tệp. Chúng tôi sẽ sao chép Tệp Excel mẫu của chúng tôi để chúng tôi có một tệp đầu ra được đặt tên tốt (có tên tham số trong đó). Định cấu hình nó là

  • IsDestinationPathVariable:True
  • DestinationVarible:User ::OutputFileName
  • OverwriteDestination:True
  • Thao tác:Sao chép tệp
  • IsSourcePathVariable:True
  • SourceVariable:Người dùng ::TemplateFile

DFT Tạo đầu ra

Đây là một Nhiệm vụ Luồng Dữ liệu. Tôi giả sử bạn chỉ kết xuất kết quả thẳng vào một tệp, vì vậy chúng tôi sẽ chỉ cần Nguồn OLE DB và Đích đến của Excel

OLEDB dbo_storedProcedure1

Đây là nơi dữ liệu của bạn được lấy từ hệ thống nguồn của bạn với tham số mà chúng tôi đã cắt nhỏ trong Quy trình kiểm soát. Tôi sẽ viết truy vấn của mình vào đây và sử dụng ? để cho biết nó có một tham số.

Thay đổi chế độ truy cập Dữ liệu của bạn thành "Lệnh SQL" và trong văn bản lệnh SQL có sẵn, hãy đặt truy vấn của bạn

EXECUTE dbo.storedProcedure1 ?

Tôi nhấp vào nút Tham số ... và điền vào như được hiển thị

  • Tham số:@parameterValue
  • Các biến:Người dùng ::Tham số Giá trị
  • Hướng tham số:Đầu vào

Kết nối Đích Excel với Nguồn OLE DB. Bấm đúp và trong phần Trình quản lý Kết nối Excel, bấm Mới ... Xác định xem bạn cần định dạng 2003 hay 2007 (.xls so với .xlsx) và liệu bạn có muốn tệp của mình có các hàng tiêu đề hay không. Đối với bạn Đường dẫn tệp, hãy nhập cùng một giá trị mà bạn đã sử dụng cho biến @User ::TemplatePath và nhấp vào OK.

Bây giờ chúng ta cần điền tên của Trang tính Excel. Nhấp vào nút Mới ... và nó có thể báo rằng không có đủ thông tin về các kiểu dữ liệu ánh xạ. Đừng lo lắng, đó là bán tiêu chuẩn. Sau đó, nó sẽ bật lên một định nghĩa bảng giống như

CREATE TABLE `Excel Destination` (
    `name` NVARCHAR(35),
    `number` INT,
    `type` NVARCHAR(3),
    `low` INT,
    `high` INT,
    `status` INT
)

Tên "bảng" sẽ là tên trang tính, hay chính xác là tập dữ liệu được đặt tên trong trang tính. Tôi đã tạo Sheet1 của mình và nhấp vào OK. Bây giờ trang tính đã tồn tại, hãy chọn nó trong trình đơn thả xuống. Tôi đã chọn Sheet1 $ làm tên trang tính mục tiêu. Không chắc liệu nó có tạo ra sự khác biệt hay không.

Nhấp vào tab Ánh xạ và mọi thứ sẽ tự động lập bản đồ tốt, vì vậy hãy nhấp vào OK.

Cuối cùng

Tại thời điểm này, nếu chúng tôi chạy gói, nó sẽ ghi đè lên tệp mẫu mỗi lần. Bí mật là chúng ta cần nói rằng Excel Connection Manager chúng tôi chỉ thực hiện rằng nó không cần phải có một tên mã cứng.

Bấm một lần vào Trình quản lý Kết nối Excel trong tab Trình quản lý Kết nối. Trong cửa sổ Thuộc tính, tìm Expressions và nhấp vào dấu ba chấm ... Ở đây chúng ta sẽ cấu hình Thuộc tính ExcelFilePath và Biểu thức chúng tôi sẽ sử dụng là @[User::OutputFileName]

Nếu các biểu tượng của bạn và những thứ đó trông khác nhau, thì điều đó có thể xảy ra. Điều này được ghi lại bằng SSIS 2012. Luồng công việc của bạn sẽ giống nhau trong năm 2005 và 2008 / 2008R2 chỉ là giao diện là khác nhau.

Nếu bạn chạy gói này và nó thậm chí không khởi động và có lỗi về ACE 12 hoặc Jet 4.0 gì đó không khả dụng, thì bạn đang sử dụng máy 64 bit và cần cho BIDS / SSDT biết rằng bạn muốn chạy ở 32 bit. chế độ.

Đảm bảo giá trị Run64BitRuntime là False . Cài đặt dự án này có thể được tìm thấy bằng cách nhấp chuột phải vào dự án, mở rộng Thuộc tính cấu hình và nó sẽ là một tùy chọn trong Gỡ lỗi.

Đọc thêm

Có thể tìm thấy một ví dụ khác về việc cắt nhỏ đối tượng tập bản ghi trên Cách tự động hóa việc thực thi thủ tục được lưu trữ với gói SSIS?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối HP-UX Itanium với SQL Server

  2. Duy trì mối quan hệ cha-con khi sao chép dữ liệu phân cấp

  3. Làm cách nào để chạy nhiều lệnh SQL trong một kết nối SQL?

  4. Có thể xảy ra va chạm GUID không?

  5. Làm cách nào để tạo khóa chính làm AUTOINCREMENT