Secara konseptual, seperti apa solusi Anda nantinya adalah menjalankan kueri sumber Anda untuk menghasilkan kumpulan hasil Anda. Simpan itu ke dalam variabel dan kemudian Anda harus melakukan iterasi melalui hasil tersebut dan untuk setiap baris, Anda akan ingin memanggil prosedur tersimpan Anda dengan nilai baris itu dan mengirimkan hasilnya ke file Excel baru.
Saya membayangkan paket Anda terlihat seperti ini
Execute SQL Task, bernama "SQL Load Recordset", dilampirkan ke Foreach Loop Container, bernama "FELC Shred Recordset". Bersarang di sana saya memiliki Tugas Sistem File, bernama "FST Copy Template" yang merupakan prioritas untuk Tugas Aliran Data, bernama "DFT Generate Output".
Siapkan
Sebagai seorang pemula, saya akan mencoba dan menjelaskan secara rinci. Untuk menghemat kerumitan, ambil salinan BIDSHelper. Ini adalah alat sumber terbuka gratis yang meningkatkan pengalaman desain di BIDS/SSDT.
Variabel
Klik pada latar belakang Aliran Kontrol Anda. Dengan tidak ada yang dipilih, klik kanan dan pilih Variabel. Di jendela baru yang muncul, klik tombol yang membuat Variabel Baru sebanyak 4 kali. Alasan untuk tidak mengklik apa pun adalah bahwa hingga SQL Server 2012, perilaku default pembuatan variabel adalah membuatnya pada lingkup objek saat ini. Ini telah mengakibatkan banyak rambut rontok untuk pengembang baru dan berpengalaman. Nama variabel peka terhadap huruf besar/kecil, jadi perhatikan juga.
- Ganti Nama Variabel menjadi RecordSet. Ubah tipe Data dari Int32 menjadi Object
- Ganti nama Variabel1 menjadi ParameterValue. Ubah tipe data dari Int32 menjadi String
- Ganti Nama Variabel2 menjadi File Template. Ubah tipe data dari Int32 menjadi String. Tetapkan nilai ke jalur File Excel keluaran Anda. Saya menggunakan C:\ssisdata\ShredRecordset.xlsx
- Ganti Nama Variabel 4 menjadi OutputFileName. Ubah tipe data dari Int32 menjadi String. Di sini kita akan melakukan sesuatu yang sedikit maju. Klik pada variabel dan tekan F4 untuk membuka jendela Properties. Ubah nilai EvaluateAsExpression menjadi True. Dalam Ekspresi, setel ke
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(atau apa pun file dan jalur Anda). Apa yang dilakukan, adalah mengonfigurasi variabel untuk diubah saat nilai ParameterValue berubah. Ini membantu memastikan kami mendapatkan nama file yang unik. Anda dipersilakan untuk mengubah konvensi penamaan sesuai kebutuhan. Perhatikan bahwa Anda harus keluar dari\
kapan pun Anda berada dalam ekspresi.
Manajer Koneksi
Saya telah membuat asumsi Anda menggunakan manajer koneksi OLE DB. Milik saya bernama FOO. Jika Anda menggunakan ADO.NET, konsepnya akan serupa tetapi akan ada nuansa yang berkaitan dengan parameter dan semacamnya.
Anda juga akan membutuhkan Connection Manager kedua untuk menangani Excel. Jika SSIS adalah temperamental tentang tipe data, Excel benar-benar psikotik-menusuk-Anda-di-belakang-dengan-garpu-saat-Anda sedang tidur tentang tipe data. Kita akan menunggu dan membiarkan aliran data benar-benar membuat Connection Manager ini untuk memastikan tipe kita baik.
Kueri Sumber ke Kumpulan Hasil
SQL Load Recordset
adalah turunan dari Execute SQL Task. Di sini saya memiliki kueri sederhana untuk meniru sumber Anda.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
Yang penting untuk diperhatikan pada tab General adalah saya telah mengganti ResultSet saya dari None
ke Full result set
. Melakukan hal ini membuat tab Set Hasil berubah dari abu-abu menjadi dapat digunakan.
Anda dapat mengamati bahwa saya telah menetapkan Nama Variabel ke variabel yang kita buat di atas (User::RecordSet) dan Saya Nama Hasil adalah 0
. Itu penting sebagai nilai default, NewResultName
tidak berfungsi.
FELC Shred Recordset
Ambil Wadah Foreach Loop dan kami akan menggunakannya untuk "menghancurkan" hasil yang dihasilkan pada langkah sebelumnya.
Konfigurasikan enumerator sebagai Foreach ADO Enumerator
Gunakan User::RecordSet
sebagai variabel sumber objek ADO Anda. Pilih rows in the first table
sebagai mode Enumerasi Anda
Pada tab Pemetaan Variabel, Anda harus memilih variabel User::ParameterValue
Anda dan menetapkannya sebagai Indeks 0. Ini akan menghasilkan elemen ke-nol dalam objek recordset Anda yang ditetapkan ke variabel ParameterValue. Anda harus memiliki perjanjian tipe data karena SSIS tidak akan melakukan konversi implisit di sini.
Template Salinan FST
Ini Tugas Sistem File. Kami akan menyalin File Excel template kami sehingga kami memiliki file output bernama baik (memiliki nama parameter di dalamnya). Konfigurasikan sebagai
- IsDestinationPathVariable:Benar
- DestinationVarible:Pengguna::OutputFileName
- OverwriteDestination:Benar
- Operasi:Salin File
- IsSourcePathVariable:Benar
- Variabel Sumber:Pengguna::TemplateFile
DFT Menghasilkan Keluaran
Ini adalah Tugas Aliran Data. Saya berasumsi Anda hanya membuang hasil langsung ke file jadi kami hanya perlu Sumber OLE DB dan Tujuan Excel
OLEDB dbo_storedProcedure1
Di sinilah data Anda diambil dari sistem sumber Anda dengan parameter yang kami robek di Control Flow. Saya akan menulis pertanyaan saya di sini dan menggunakan ?
untuk menunjukkan bahwa ia memiliki parameter.
Ubah mode akses Data Anda ke "Perintah SQL" dan di teks perintah SQL yang tersedia, masukkan kueri Anda
EXECUTE dbo.storedProcedure1 ?
Saya mengklik tombol Parameters... dan mengisinya seperti yang ditunjukkan
- Parameter:@parameterValue
- Variabel:Pengguna::ParameterValue
- Arah param:Masukan
Hubungkan Tujuan Excel ke Sumber OLE DB. Klik dua kali dan di bagian Manajer Koneksi Excel, klik Baru... Tentukan apakah Anda memerlukan format 2003 atau 2007 (.xls vs .xlsx) dan apakah Anda ingin file Anda memiliki baris header. Untuk File Path Anda, masukkan nilai yang sama dengan yang Anda gunakan untuk variabel @User::TemplatePath dan klik OK.
Kita sekarang perlu mengisi nama Lembar Excel. Klik tombol New... itu dan mungkin akan menyalak bahwa tidak ada informasi yang cukup tentang pemetaan tipe data. Jangan khawatir, itu semi-standar. Kemudian akan muncul definisi tabel seperti
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
Nama "tabel" akan menjadi nama lembar kerja, atau tepatnya, kumpulan data bernama di lembar kerja. Saya membuat Sheet1 milik saya dan mengklik OK. Sekarang setelah lembar itu ada, pilih di drop down. Saya menggunakan Sheet1$ sebagai nama sheet target. Tidak yakin apakah itu membuat perbedaan.
Klik tab Pemetaan dan semuanya akan dipetakan secara otomatis dengan baik, jadi klik OK.
Akhirnya
Pada titik ini, jika kita menjalankan paket itu akan menimpa file template setiap saat. Rahasianya adalah kita perlu memberi tahu bahwa Excel Connection Manager
kami baru saja membuatnya tidak perlu memiliki nama kode yang sulit.
Klik sekali pada Manajer Koneksi Excel di tab Manajer Koneksi. Di jendela Properties, temukan Expressions
bagian dan klik elips ...
Di sini kita akan mengkonfigurasi Properti ExcelFilePath
dan Ekspresi yang akan kita gunakan adalah@[User::OutputFileName]
Jika ikon Anda dan semacamnya terlihat berbeda, itulah yang diharapkan. Ini didokumentasikan menggunakan SSIS 2012. Alur kerja Anda akan sama pada tahun 2005 dan 2008/2008R2 hanya kulitnya yang berbeda.
Jika Anda menjalankan paket ini dan bahkan tidak memulai dan ada kesalahan tentang ACE 12 atau Jet 4.0 sesuatu yang tidak tersedia, maka Anda menggunakan mesin 64bit dan perlu memberi tahu BIDS/SSDT bahwa Anda ingin menjalankan dalam 32 bit modus.
Pastikan nilai Run64BitRuntime adalah False
. Pengaturan proyek ini dapat ditemukan dengan mengklik kanan pada proyek, memperluas Properti Konfigurasi dan itu akan menjadi opsi di bawah Debugging.
Bacaan lebih lanjut
Contoh berbeda dari merobek-robek objek recordset dapat ditemukan di Bagaimana mengotomatiskan eksekusi prosedur tersimpan dengan paket SSIS?