Konceptuelt, hvordan din løsning vil se ud, er at udføre din kildeforespørgsel for at generere dit resultatsæt. Gem det i en variabel, og så bliver du nødt til at gentage disse resultater, og for hver række vil du kalde din lagrede procedure med den pågældende rækkes værdi og sende resultaterne til en ny Excel-fil.
Jeg kunne forestille mig, at din pakke ser sådan ud
En udfør SQL-opgave, kaldet "SQL Load Recordset", knyttet til en Foreach Loop Container, kaldet "FELC Shred Recordset". Indlejret derinde har jeg en filsystemopgave, kaldet "FST Copy Template", som er en forrang for en dataflowopgave, kaldet "DFT Generate Output".
Konfigurer
Da du er nybegynder, vil jeg prøve at forklare i detaljer. For at spare dig selv for noget besvær, tag en kopi af BIDSHelper. Det er et gratis open source-værktøj, der forbedrer designoplevelsen i BIDS/SSDT.
Variabler
Klik på baggrunden for dit kontrolflow. Med intet valgt, højreklik og vælg Variabler. I det nye vindue, der dukker op, skal du klikke på knappen, der opretter en ny variabel 4 gange. Årsagen til at du ikke klikker på noget er, at indtil SQL Server 2012 er standardopførselen ved oprettelse af variabler at oprette dem inden for rammerne af det aktuelle objekt. Dette har resulteret i mange tabte hår for både nye og erfarne udviklere. Variablenavne skelner mellem store og små bogstaver, så vær også opmærksom på det.
- Omdøb variabel til RecordSet. Skift datatypen fra Int32 til Objekt
- Omdøb Variable1 til ParameterValue. Skift datatypen fra Int32 til String
- Omdøb Variable2 til TemplateFile. Skift datatypen fra Int32 til String. Indstil værdien til stien til din output Excel-fil. Jeg brugte C:\ssisdata\ShredRecordset.xlsx
- Omdøb variabel 4 til OutputFileName. Skift datatypen fra Int32 til String. Her skal vi lave noget lidt avanceret. Klik på variablen og tryk på F4 for at få vinduet Egenskaber frem. Skift værdien af EvaluateAsExpression til True. Indstil det til
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(eller hvad din fil og sti er). Hvad dette gør, er at konfigurere en variabel til at ændre sig, når værdien af ParameterValue ændres. Dette er med til at sikre, at vi får et unikt filnavn. Du er velkommen til at ændre navnekonventionen efter behov. Bemærk, at du skal undslippe\
hver gang du er i et udtryk.
Forbindelsesadministratorer
Jeg har gjort den antagelse, at du bruger en OLE DB-forbindelsesmanager. Min hedder FOO. Hvis du bruger ADO.NET, vil koncepterne være ens, men der vil være nuancer vedrørende parametre og sådan.
Du skal også bruge en anden Connection Manager til at håndtere Excel. Hvis SSIS er temperamentsfuld omkring datatyper, er Excel fladt psykotisk-stik-dig-i-ryg-med-en-gaffel-mens-du-sover om datatyper. Vi vil vente og lade datastrømmen faktisk skabe denne forbindelsesadministrator for at sikre, at vores typer er gode.
Kildeforespørgsel til resultatsæt
SQL Load Recordset
er en forekomst af Execute SQL Task. Her har jeg en simpel forespørgsel for at efterligne din kilde.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
Det, der er vigtigt at bemærke på fanen Generelt er, at jeg har skiftet mit resultatsæt fra None
til Full result set
. Hvis du gør dette, går fanen Resultatsæt fra at være nedtonet til brugbar.
Du kan se, at jeg har tildelt variabelnavnet til den variabel, vi oprettede ovenfor (User::RecordSet) og I resultatnavnet er 0
. Det er vigtigt som standardværdien, NewResultName
virker ikke.
FELC Shred Recordset
Tag fat i en Foreach Loop Container, og vi vil bruge den til at "makulere" de resultater, der blev genereret i det foregående trin.
Konfigurer tælleren som en Foreach ADO Enumerator
Brug User::RecordSet
som din ADO-objektkildevariabel. Vælg rows in the first table
som din optællingstilstand
På fanen Variable Mappings skal du vælge din variabel User::ParameterValue
og tildel det indekset 0. Dette vil resultere i, at det nulte element i dit postsætobjekt bliver tildelt variablen ParameterValue. Det er vigtigt, at du har en datatypeaftale, da SSIS ikke vil foretage implicitte konverteringer her.
FST-kopi-skabelon
Dette er en filsystemopgave. Vi vil kopiere vores skabelon Excel-fil, så vi har en velnavngivet outputfil (har parameternavnet i sig). Konfigurer det som
- IsDestinationPathVariable:Sand
- DestinationVarible:Bruger::OutputFileName
- Overskriv destination:Sand
- Betjening:Kopier fil
- IsSourcePathVariable:Sand
- Kildevariabel:Bruger::TemplateFile
DFT Generer output
Dette er en dataflowopgave. Jeg går ud fra, at du bare dumper resultater direkte til en fil, så vi skal bare bruge en OLE DB-kilde og en Excel-destination
OLEDB dbo_storedProcedure1
Det er her, dine data hentes fra dit kildesystem med den parameter, vi makulerede i kontrolflowet. Jeg vil skrive min forespørgsel her og bruge ?
for at angive, at den har en parameter.
Skift din dataadgangstilstand til "SQL-kommando", og indsæt din forespørgsel i den tilgængelige SQL-kommandotekst
EXECUTE dbo.storedProcedure1 ?
Jeg klikker på knappen Parametre... og udfylder den som vist
- Parametre:@parameterValue
- Variabler:Bruger::ParameterValue
- Parameterretning:Input
Tilslut en Excel-destination til OLE DB-kilden. Dobbeltklik, og i Excel Connection Manager-sektionen, klik på Ny... Bestem, om du har brug for 2003- eller 2007-format (.xls vs. .xlsx), og om du ønsker, at din fil skal have overskriftsrækker. For din filsti skal du indtaste den samme værdi, som du brugte til din @User::TemplatePath-variabel og klikke på OK.
Vi skal nu udfylde navnet på Excel-arket. Klik på den Ny...-knap, og det kan gø, at der ikke er tilstrækkelig information om kortlægningsdatatyper. Bare rolig, det er semi-standard. Det vil så poppe op en tabeldefinition noget lignende
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
"Tabel"-navnet vil være regnearkets navn, eller præcist, det navngivne datasæt i regnearket. Jeg lavede mit Ark1 og klikkede OK. Nu hvor arket findes, skal du vælge det i rullemenuen. Jeg gik med Sheet1$ som målarknavn. Ikke sikker på, om det gør en forskel.
Klik på fanen Mappings, og tingene skal automatisk kortlægges fint, så klik på OK.
Endelig
På dette tidspunkt, hvis vi kørte pakken, ville den overskrive skabelonfilen hver gang. Hemmeligheden er, at vi skal fortælle det Excel Connection Manager
vi har lige lavet, at det ikke skal have et hårdt kodet navn.
Klik én gang på Excel Connection Manager på fanen Connection Managers. Find Expressions
i vinduet Egenskaber sektion og klik på ellipserne ...
Her vil vi konfigurere egenskaben ExcelFilePath
og det udtryk, vi vil bruge, er@[User::OutputFileName]
Hvis dine ikoner og sådan ser anderledes ud, kan det forventes. Dette blev dokumenteret ved hjælp af SSIS 2012. Dit arbejdsflow vil være det samme i 2005 og 2008/2008R2, bare huden er anderledes.
Hvis du kører denne pakke, og den ikke engang starter, og der er en fejl om ACE 12 eller Jet 4.0 noget, der ikke er tilgængeligt, så er du på en 64bit maskine og skal fortælle BIDS/SSDT, at du vil køre i 32 bit tilstand.
Sørg for, at Run64BitRuntime-værdien er False
. Denne projektindstilling kan findes ved at højreklikke på projektet, udvide konfigurationsegenskaberne, og det vil være en mulighed under Fejlretning.
Yderligere læsning
Et andet eksempel på makulering af et recordset-objekt kan findes på Hvordan automatiserer man udførelsen af en lagret procedure med en SSIS-pakke?