Conceptueel gezien, hoe uw oplossing eruit zal zien, is het uitvoeren van uw bronquery om uw resultatenset te genereren. Sla dat op in een variabele en dan moet je die resultaten herhalen en voor elke rij wil je je opgeslagen procedure aanroepen met de waarde van die rij en de resultaten naar een nieuw Excel-bestand sturen.
Ik zou me voorstellen dat je pakket er ongeveer zo uitziet
Een SQL-taak uitvoeren, genaamd "SQL Load Recordset", gekoppeld aan een Foreach Loop Container, genaamd "FELC Shred Recordset". Daarin genesteld heb ik een bestandssysteemtaak, genaamd "FST Copy Template", wat een prioriteit is voor een Data Flow Task, genaamd "DFT Generate Output".
Instellen
Omdat je een beginner bent, ga ik proberen het in detail uit te leggen. Om uzelf wat gedoe te besparen, kunt u een exemplaar van BIDSHelper pakken. Het is een gratis, open source-tool die de ontwerpervaring in BIDS/SSDT verbetert.
Variabelen
Klik op de achtergrond van uw Control Flow. Als er niets is geselecteerd, klikt u met de rechtermuisknop en selecteert u Variabelen. Klik in het nieuwe venster dat verschijnt 4 keer op de knop waarmee een nieuwe variabele wordt gemaakt. De reden om op niets te klikken is dat tot SQL Server 2012 het standaardgedrag van het maken van variabelen is om ze te maken binnen het bereik van het huidige object. Dit heeft geresulteerd in veel verloren haren voor zowel nieuwe als ervaren ontwikkelaars. Variabelenamen zijn hoofdlettergevoelig, dus houd daar ook rekening mee.
- Hernoem variabele naar RecordSet. Wijzig het gegevenstype van Int32 in Object
- Hernoem variabele1 in ParameterValue. Wijzig het gegevenstype van Int32 in String
- Hernoem variabele2 naar TemplateFile. Wijzig het gegevenstype van Int32 in String. Stel de waarde in op het pad van uw Excel-uitvoerbestand. Ik gebruikte C:\ssisdata\ShredRecordset.xlsx
- Hernoem variabele 4 in OutputFileName. Wijzig het gegevenstype van Int32 in String. Hier gaan we iets geavanceerds doen. Klik op de variabele en druk op F4 om het venster Eigenschappen te openen. Wijzig de waarde van EvaluateAsExpression in True. Stel het in Expression in op
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(of wat uw bestand en pad ook zijn). Wat dit doet, is een variabele configureren om te veranderen als de waarde van ParameterValue verandert. Dit zorgt ervoor dat we een unieke bestandsnaam krijgen. U bent van harte welkom om de naamgevingsconventie zo nodig te wijzigen. Merk op dat u moet ontsnappen aan de\
elke keer dat u zich in een uitdrukking bevindt.
Verbindingsmanagers
Ik ben ervan uitgegaan dat u een OLE DB-verbindingsbeheerder gebruikt. De mijne heet FOO. Als u ADO.NET gebruikt, zullen de concepten vergelijkbaar zijn, maar er zullen nuances zijn met betrekking tot parameters en dergelijke.
Je hebt ook een tweede Connection Manager nodig om Excel te kunnen gebruiken. Als SSIS temperamentvol is over gegevenstypen, is Excel ronduit psychotisch-in-de-rug-met-een-vork-terwijl-u slaapt over gegevenstypen. We wachten af en laten de gegevensstroom deze verbindingsmanager daadwerkelijk maken om ervoor te zorgen dat onze typen goed zijn.
Bronquery naar resultaatset
De SQL Load Recordset
is een instantie van de Execute SQL Task. Hier heb ik een eenvoudige vraag om uw bron na te bootsen.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
Wat belangrijk is om op te merken op het tabblad Algemeen is dat ik mijn ResultSet heb gewijzigd van None
naar Full result set
. Als u dit doet, verandert het tabblad Resultatenset van grijs naar bruikbaar.
Je kunt zien dat ik de variabelenaam heb toegewezen aan de variabele die we hierboven hebben gemaakt (User::RecordSet) en I de resultaatnaam is 0
. Dat is belangrijk als de standaardwaarde, NewResultName
werkt niet.
FELC Shred Recordset
Pak een Forreach Loop-container en we zullen die gebruiken om de resultaten die in de vorige stap zijn gegenereerd, te "versnipperen".
Configureer de enumerator als een Foreach ADO Enumerator
Gebruik User::RecordSet
als uw ADO-objectbronvariabele. Selecteer rows in the first table
als uw opsommingsmodus
Op het tabblad Variabele toewijzingen moet u uw variabele User::ParameterValue
selecteren en ken het de Index van 0 toe. Dit zal ertoe leiden dat het nulde element in uw recordset-object wordt toegewezen aan de variabele ParameterValue. Het is belangrijk dat u een overeenkomst voor het gegevenstype heeft, aangezien SSIS hier geen impliciete conversies zal uitvoeren.
FST-sjabloon kopiëren
Dit is een bestandssysteemtaak. We gaan ons sjabloon Excel-bestand kopiëren, zodat we een goed genoemd uitvoerbestand hebben (met de parameternaam erin). Configureer het als
- IsDestinationPathVariable:True
- DestinationVarible:User::OutputFileName
- Bestemming overschrijven:waar
- Bewerking:bestand kopiëren
- IsSourcePathVariable:True
- Bronvariabele:Gebruiker::TemplateFile
DFT output genereren
Dit is een gegevensstroomtaak. Ik neem aan dat je de resultaten gewoon rechtstreeks naar een bestand dumpt, dus we hebben alleen een OLE DB-bron en een Excel-bestemming nodig
OLEDB dbo_storedProcedure1
Hier worden uw gegevens uit uw bronsysteem gehaald met de parameter die we in de Control Flow hebben versnipperd. Ik ga mijn vraag hier schrijven en de ?
. gebruiken om aan te geven dat het een parameter heeft.
Wijzig uw gegevenstoegangsmodus in "SQL-opdracht" en plaats uw vraag in de beschikbare SQL-opdrachttekst
EXECUTE dbo.storedProcedure1 ?
Ik klik op de knop Parameters... en vul het in zoals weergegeven
- Parameters:@parameterValue
- Variabelen:Gebruiker::ParameterValue
- Paramrichting:invoer
Verbind een Excel-bestemming met de OLE DB-bron. Dubbelklik en klik in het gedeelte Excel Connection Manager op Nieuw... Bepaal of u de indeling 2003 of 2007 (.xls versus .xlsx) nodig hebt en of u wilt dat uw bestand koptekstrijen heeft. Voer voor uw bestandspad dezelfde waarde in die u hebt gebruikt voor uw @User::TemplatePath-variabele en klik op OK.
We moeten nu de naam van het Excel-blad invullen. Klik op die knop Nieuw... en het kan blaffen dat er niet voldoende informatie is over kaartgegevenstypen. Maak je geen zorgen, dat is semi-standaard. Er verschijnt dan een tabeldefinitie, zoiets als
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
De naam van de "tabel" wordt de naam van het werkblad, of precies de benoemde gegevensset in het werkblad. Ik heb de mijne Sheet1 gemaakt en op OK geklikt. Nu het blad bestaat, selecteert u het in de vervolgkeuzelijst. Ik ging met de Sheet1$ als de naam van het doelblad. Ik weet niet zeker of het een verschil maakt.
Klik op het tabblad Mappings en de dingen zouden automatisch goed moeten worden toegewezen, dus klik op OK.
Eindelijk
Op dit punt, als we het pakket zouden uitvoeren, zou het het sjabloonbestand elke keer overschrijven. Het geheim is dat we moeten vertellen dat Excel Connection Manager
we hebben zojuist gemaakt dat het geen hard gecodeerde naam hoeft te hebben.
Klik eenmaal op de Excel Connection Manager op het tabblad Connection Managers. Zoek in het venster Eigenschappen de Expressions
sectie en klik op de weglatingstekens ...
Hier configureren we de eigenschap ExcelFilePath
en de uitdrukking die we zullen gebruiken is@[User::OutputFileName]
Als je pictogrammen en dergelijke er anders uitzien, is dat te verwachten. Dit werd gedocumenteerd met behulp van SSIS 2012. Uw werkstroom zal hetzelfde zijn in 2005 en 2008/2008R2, alleen de skin is anders.
Als u dit pakket uitvoert en het start niet eens en er is een fout over de ACE 12 of Jet 4.0, iets dat niet beschikbaar is, dan bevindt u zich op een 64bit-machine en moet u BIDS/SSDT vertellen dat u in 32 bit wilt draaien modus.
Zorg ervoor dat de Run64BitRuntime-waarde False
is . Deze projectinstelling kan worden gevonden door met de rechtermuisknop op het project te klikken, de Configuratie-eigenschappen uit te vouwen en het zal een optie zijn onder Foutopsporing.
Verder lezen
Een ander voorbeeld van het vernietigen van een recordset-object is te vinden op Hoe de uitvoering van een opgeslagen procedure te automatiseren met een SSIS-pakket?