Концептуално, как ще изглежда вашето решение, е да изпълните вашата заявка за източник, за да генерирате вашия набор от резултати. Съхранете това в променлива и след това ще трябва да повторите тези резултати и за всеки ред ще искате да извикате своята съхранена процедура със стойността на този ред и да изпратите резултатите в нов файл на Excel.
Бих си представял вашия пакет да изглежда нещо подобно
Изпълнение на SQL задача, наречена "SQL Load Recordset", прикачена към контейнер за цикъл Foreach, наречен "FELC Shred Recordset". Вложена вътре имам задача на файловата система, наречена "FST Copy Template", която е приоритет за задача за поток от данни, наречена "DFT Generate Output".
Настройване
Тъй като сте начинаещ, ще се опитам да обясня подробно. За да си спестите неприятности, вземете копие на BIDSHelper. Това е безплатен инструмент с отворен код, който подобрява изживяването при проектиране в BIDS/SSDT.
Променливи
Щракнете върху фона на вашия Control Flow. Без нищо избрано, щракнете с десния бутон и изберете Променливи. В новия прозорец, който се появява, щракнете върху бутона, който създава нова променлива 4 пъти. Причината да щракнете върху нищо е, че до SQL Server 2012 поведението по подразбиране при създаване на променливи е да се създават в обхвата на текущия обект. Това доведе до много загубени коси както за нови, така и за опитни разработчици. Имената на променливите са чувствителни към главни букви, така че имайте предвид и това.
- Преименувайте променлива на RecordSet. Променете типа данни от Int32 на Object
- Преименувайте променлива 1 на ParameterValue. Променете типа данни от Int32 на String
- Преименувайте променлива 2 на TemplateFile. Променете типа данни от Int32 на String. Задайте стойността на пътя на вашия изходен Excel файл. Използвах C:\ssisdata\ShredRecordset.xlsx
- Преименувайте променлива 4 на OutputFileName. Променете типа данни от Int32 на String. Тук ще направим нещо леко напреднало. Щракнете върху променливата и натиснете F4, за да изведете прозореца Properties. Променете стойността на EvaluateAsExpression на True. В Expression го задайте на
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(или какъвто и да е вашият файл и път). Това, което прави, е да конфигурира променлива, която да се променя при промяна на стойността на ParameterValue. Това помага да се гарантира, че ще получим уникално име на файла. Можете да промените конвенцията за именуване, ако е необходимо. Имайте предвид, че трябва да избягате от\
всеки път, когато сте в израз.
Мениджъри на връзки
Направих предположението, че използвате OLE DB мениджър на връзки. Моят се казва FOO. Ако използвате ADO.NET, концепциите ще бъдат подобни, но ще има нюанси, отнасящи се до параметри и други подобни.
Ще ви е необходим и втори мениджър на връзки за работа с Excel. Ако SSIS е темпераментен по отношение на типовете данни, Excel е направо психотичен-проби-ви-в-гърба-с-вилица-докато-спите за типове данни. Ще изчакаме и ще оставим потока от данни действително да създаде този мениджър на връзки, за да гарантираме, че нашите типове са добри.
Изходна заявка към набор от резултати
SQL Load Recordset
е екземпляр на задачата Изпълнение на SQL. Тук имам проста заявка, за да имитирам вашия източник.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
Това, което е важно да се отбележи в раздела Общи, е, че превключих моя ResultSet от None
към Full result set
. Правейки това прави раздела „Набор с резултати“ от сив цвят до използваем.
Можете да забележите, че съм присвоил името на променливата на променливата, която създадохме по-горе (User::RecordSet) и I Името на резултата е 0
. Това е важно като стойност по подразбиране, NewResultName
не работи.
FELC Shred Recordset
Вземете контейнер за цикъл Foreach и ще го използваме, за да "раздробим" резултатите, генерирани в предходната стъпка.
Конфигурирайте преброителя като Foreach ADO Enumerator
Използвайте User::RecordSet
като вашата променлива източник на ADO обект. Изберете rows in the first table
като вашия режим на изброяване
В раздела Съпоставяне на променливи ще трябва да изберете вашата променлива User::ParameterValue
и му присвоете индекс 0. Това ще доведе до това, че нулевият елемент във вашия обект на набор от записи ще бъде присвоен на променливата ParameterValue. Важно е да имате споразумение за тип данни, тъй като SSIS няма да извършва неявни преобразувания тук.
Шаблон за копиране на FST
Това е задача на файловата система. Ще копираме нашия шаблон на Excel файл, така че да имаме изходен файл с добре име (в него има името на параметъра). Конфигурирайте го като
- IsDestinationPathVariable:Вярно
- DestinationVarible:User::OutputFileName
- Презаписване на дестинация:Вярно
- Операция:Копиране на файл
- IsSourcePathVariable:Вярно
- SourceVariable:User::TemplateFile
Изход за генериране на DFT
Това е задача за поток от данни. Предполагам, че просто изхвърляте резултатите направо във файл, така че ще ни трябва само източник на OLE DB и цел на Excel
OLEDB dbo_storedProcedure1
Това е мястото, където вашите данни се изтеглят от вашата изходна система с параметъра, който раздробихме в Control Flow. Ще напиша заявката си тук и ще използвам ?
за да посочите, че има параметър.
Променете режима си за достъп до данни на „SQL Command“ и в текста на SQL командата, който е наличен, поставете своята заявка
EXECUTE dbo.storedProcedure1 ?
Щраквам върху бутона Параметри... и го попълвам, както е показано
- Параметри:@parameterValue
- Променливи:User::ParameterValue
- Посока на параметрите:Въвеждане
Свържете цел на Excel към източника на OLE DB. Щракнете двукратно и в секцията Excel Connection Manager щракнете върху Нов... Определете дали имате нужда от формат 2003 или 2007 (.xls срещу .xlsx) и дали искате файлът ви да има заглавни редове. За своя път към файла поставете същата стойност, която сте използвали за вашата променлива @User::TemplatePath и щракнете върху OK.
Сега трябва да попълним името на листа на Excel. Щракнете върху този бутон Нов... и може да излае, че няма достатъчно информация за типовете данни за картографиране. Не се притеснявайте, това е полустандартно. След това ще изскочи дефиниция на таблица, нещо като
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
Името на "таблица" ще бъде името на работния лист или по-точно наименуваният набор от данни в работния лист. Направих моя Sheet1 и щракнах върху OK. Сега, когато листът съществува, изберете го в падащото меню. Отидох с Sheet1$ като име на целевия лист. Не съм сигурен дали има разлика.
Щракнете върху раздела Съпоставяне и нещата ще се картографират автоматично, така че щракнете върху OK.
Най-накрая
В този момент, ако стартираме пакета, той ще презаписва шаблонния файл всеки път. Тайната е, че трябва да кажем, че Excel Connection Manager
току-що направихме, че трябва да няма твърдо кодирано име.
Щракнете веднъж върху Мениджъра на връзки на Excel в раздела Мениджъри на връзки. В прозореца Свойства намерете Expressions
раздел и щракнете върху многоточия ...
Тук ще конфигурираме свойството ExcelFilePath
и изразът, който ще използваме е@[User::OutputFileName]
Ако вашите икони и други изглеждат различно, това може да се очаква. Това е документирано с помощта на SSIS 2012. Работният ви поток ще бъде същият през 2005 и 2008/2008R2, само кожата е различна.
Ако стартирате този пакет и той дори не стартира и има грешка за ACE 12 или Jet 4.0 нещо, което не е налично, значи сте на 64-битова машина и трябва да кажете на BIDS/SSDT, че искате да стартирате в 32 бита режим.
Уверете се, че стойността на Run64BitRuntime е False
. Тази настройка на проекта може да бъде намерена, като щракнете с десния бутон върху проекта, разгънете Свойствата на конфигурацията и ще бъде опция под Отстраняване на грешки.
Допълнително четене
Друг пример за раздробяване на обект на набор от записи може да се намери в Как да автоматизирам изпълнението на съхранена процедура с SSIS пакет?