sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skickar jag ett värde till en lagrad procedurparameter i OLE DB Source-komponent?

Begreppsmässigt, hur din lösning kommer att se ut är att köra din källfråga för att generera din resultatuppsättning. Lagra det i en variabel och sedan måste du iterera igenom dessa resultat och för varje rad vill du anropa din lagrade procedur med den radens värde och skicka resultaten till en ny Excel-fil.

Jag skulle föreställa mig att ditt paket skulle se ut ungefär så här

En Execute SQL Task, som heter "SQL Load Recordset", kopplad till en Foreach Loop Container, med namnet "FELC Shred Recordset". Kapslad där inne har jag en filsystemuppgift som heter "FST Copy Template" vilket är en företräde för en dataflödesuppgift, som heter "DFT Generate Output".

Konfigurera

Eftersom du är nybörjare ska jag försöka förklara i detalj. För att spara dig själv lite krångel, ta en kopia av BIDSHelper. Det är ett gratis verktyg med öppen källkod som förbättrar designupplevelsen i BIDS/SSDT.

Variabler

Klicka på bakgrunden för ditt kontrollflöde. Med ingenting markerat, högerklicka och välj Variabler. I det nya fönstret som dyker upp klickar du på knappen som skapar en ny variabel fyra gånger. Anledningen till att du klickar på ingenting är att fram till SQL Server 2012 är standardbeteendet för att skapa variabler att skapa dem inom ramen för det aktuella objektet. Detta har resulterat i många tappade hårstrån för både nya och erfarna utvecklare. Variabelnamn är skiftlägeskänsliga så var medveten om det också.

  1. Byt namn på variabel till RecordSet. Ändra datatypen från Int32 till Objekt
  2. Byt namn på variabel1 till ParameterValue. Ändra datatypen från Int32 till String
  3. Byt namn på variabel2 till mallfil. Ändra datatypen från Int32 till String. Ställ in värdet på sökvägen till din utdata Excel-fil. Jag använde C:\ssisdata\ShredRecordset.xlsx
  4. Byt namn på variabel 4 till OutputFileName. Ändra datatypen från Int32 till String. Här ska vi göra något lite avancerat. Klicka på variabeln och tryck på F4 för att få upp fönstret Egenskaper. Ändra värdet på EvaluateAsExpression till True. I Expression, ställ in den till "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (eller vad din fil och sökväg nu är). Vad detta gör är att konfigurera en variabel som ändras när värdet på ParameterValue ändras. Detta hjälper till att säkerställa att vi får ett unikt filnamn. Du är välkommen att ändra namnkonventionen vid behov. Observera att du måste undkomma \ varje gång du är i ett uttryck.

Anslutningshanterare

Jag har gjort antagandet att du använder en OLE DB-anslutningshanterare. Min heter FOO. Om du använder ADO.NET kommer begreppen att vara liknande men det kommer att finnas nyanser relaterade till parametrar och sådant.

Du behöver också en andra anslutningshanterare för att hantera Excel. Om SSIS är temperamentsfull när det gäller datatyper, är Excel rakt ut psykotiskt-hugg-dig-i-ryggen-med-en-gaffel-medan-du-sover om datatyper. Vi kommer att vänta och låta dataflödet faktiskt skapa den här anslutningshanteraren för att säkerställa att våra typer är bra.

Källfråga till resultatuppsättning

SQL Load Recordset är en instans av Execute SQL Task. Här har jag en enkel fråga för att efterlikna din källa.

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

Det som är viktigt att notera på fliken Allmänt är att jag har bytt resultatuppsättning från None till Full result set . Om du gör detta går fliken Resultatuppsättning från att vara nedtonad till användbar.

Du kan se att jag har tilldelat variabelnamnet till variabeln vi skapade ovan (User::RecordSet) och I resultatnamnet är 0 . Det är viktigt eftersom standardvärdet, NewResultName fungerar inte.

FELC Shred Recordset

Ta en Foreach Loop-behållare så använder vi den för att "strimma" resultaten som genererades i föregående steg.

Konfigurera enumeratorn som en Foreach ADO Enumerator Använd User::RecordSet som din ADO-objektkällvariabel. Välj rows in the first table som ditt uppräkningsläge

På fliken Variabelmappningar måste du välja din variabel User::ParameterValue och tilldela det indexet 0. Detta kommer att resultera i att det nollte elementet i ditt postuppsättningsobjekt tilldelas variabeln ParameterValue. Det är viktigt att du har datatypsavtal eftersom SSIS inte kommer att göra implicita konverteringar här.

FST Copy Mall

Detta är en filsystemuppgift. Vi kommer att kopiera vår mall Excel-fil så att vi har en väl namngiven utdatafil (har parameternamnet i sig). Konfigurera det som

  • IsDestinationPathVariable:True
  • DestinationVarible:User::OutputFileName
  • OverwriteDestination:True
  • Användning:Kopiera fil
  • IsSourcePathVariable:True
  • SourceVariable:User::TemplateFile

DFT Generera utdata

Detta är en dataflödesuppgift. Jag antar att du bara dumpar resultat direkt till en fil så vi behöver bara en OLE DB-källa och en Excel-destination

OLEDB dbo_storedProcedure1

Det är här din data hämtas från ditt källsystem med parametern vi strimlade i kontrollflödet. Jag ska skriva min fråga här och använda ? för att indikera att den har en parameter.

Ändra ditt dataåtkomstläge till "SQL Command" och ställ din fråga i SQL-kommandotexten som är tillgänglig

EXECUTE dbo.storedProcedure1 ?

Jag klickar på knappen Parametrar... och fyller i den som visas

  • Parametrar:@parameterValue
  • Variabler:User::ParameterValue
  • Paramriktning:Indata

Anslut en Excel-destination till OLE DB-källan. Dubbelklicka och i avsnittet Excel Connection Manager klickar du på Ny... Bestäm om du behöver formatet 2003 eller 2007 (.xls mot .xlsx) och om du vill att filen ska ha rubrikrader. För din filsökväg, skriv in samma värde som du använde för din @User::TemplatePath-variabel och klicka på OK.

Vi måste nu fylla i namnet på Excel-arket. Klicka på knappen Ny... och det kan skälla att det inte finns tillräcklig information om kartläggningsdatatyper. Oroa dig inte, det är halvstandard. Det kommer då att dyka upp en tabelldefinition ungefär som

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

"Tabell"-namnet kommer att vara kalkylbladets namn, eller exakt, den namngivna datamängden i kalkylbladet. Jag gjorde mitt Sheet1 och klickade på OK. Nu när arket finns, välj det i rullgardinsmenyn. Jag använde Sheet1$ som målarkets namn. Inte säker på om det gör någon skillnad.

Klicka på fliken Mappningar så ska saker och ting kartläggas automatiskt så klicka på OK.

Äntligen

Vid det här laget, om vi körde paketet, skulle det skriva över mallfilen varje gång. Hemligheten är att vi måste berätta det Excel Connection Manager vi gjorde precis att det inte behöver ha ett hårdkodat namn.

Klicka en gång på Excel Connection Manager på fliken Connection Managers. I fönstret Egenskaper letar du upp Expressions och klicka på ellipserna ... Här kommer vi att konfigurera egenskapen ExcelFilePath och uttrycket vi kommer att använda är@[User::OutputFileName]

Om dina ikoner och sådant ser annorlunda ut, är det förväntat. Detta dokumenterades med SSIS 2012. Ditt arbetsflöde kommer att vara detsamma under 2005 och 2008/2008R2, bara huden är annorlunda.

Om du kör det här paketet och det inte ens startar och det finns ett fel om ACE 12 eller Jet 4.0 något som inte är tillgängligt, då är du på en 64-bitarsmaskin och måste berätta för BIDS/SSDT att du vill köra i 32-bitars läge.

Se till att Run64BitRuntime-värdet är False . Denna projektinställning kan hittas genom att högerklicka på projektet, expandera konfigurationsegenskaperna och det kommer att vara ett alternativ under Felsökning.

Mer läsning

Ett annat exempel på fragmentering av ett postuppsättningsobjekt finns på Hur man automatiserar exekveringen av en lagrad procedur med ett SSIS-paket?




  1. 3 sätt att lista alla triggers för en given tabell i PostgreSQL

  2. Utarbetat uttalande om Postgresql i Rails

  3. Hur man hämtar datumet från en Datetime-kolumn i MySQL

  4. Hur man migrerar SQL Server-jobb från en SQL Server-instans till en annan