sql >> Databáze >  >> RDS >> Sqlserver

Jak předám hodnotu parametru uložené procedury v komponentě Zdroj OLE DB?

Koncepčně, jak bude vaše řešení vypadat, je provedení vašeho zdrojového dotazu za účelem vygenerování sady výsledků. Uložte to do proměnné a pak budete muset tyto výsledky procházet a pro každý řádek budete chtít zavolat uloženou proceduru s hodnotou tohoto řádku a odeslat výsledky do nového souboru aplikace Excel.

Představoval bych si, že váš balíček bude vypadat nějak takto

Spustit úlohu SQL s názvem "SQL Load Recordset", připojenou ke kontejneru Foreach Loop s názvem "FELC Shred Recordset". Uvnitř mám vnořenou úlohu systému souborů nazvanou „FST Copy Template“, což je priorita pro úlohu toku dat s názvem „DFT Generate Output“.

Nastavit

Protože jste začátečník, pokusím se to podrobně vysvětlit. Chcete-li si ušetřit nějaké potíže, pořiďte si kopii BIDSHelper. Je to bezplatný nástroj s otevřeným zdrojovým kódem, který zlepšuje zkušenosti s návrhem v BIDS/SSDT.

Proměnné

Klikněte na pozadí vašeho Control Flow. Pokud není nic vybráno, klikněte pravým tlačítkem a vyberte Proměnné. V novém okně, které se objeví, klikněte 4krát na tlačítko, které vytvoří novou proměnnou. Důvodem neklikání na nic je, že až do SQL Server 2012 je výchozím chováním vytváření proměnných jejich vytváření v rozsahu aktuálního objektu. To mělo za následek mnoho ztracených vlasů pro nové i zkušené vývojáře. V názvech proměnných se rozlišují velká a malá písmena, takže si toho uvědomte.

  1. Přejmenujte proměnnou na RecordSet. Změňte typ dat z Int32 na Object
  2. Přejmenujte Proměnnou1 na ParametrValue. Změňte typ dat z Int32 na String
  3. Přejmenujte Proměnnou2 na TemplateFile. Změňte typ dat z Int32 na String. Nastavte hodnotu na cestu k výstupnímu souboru Excel. Použil jsem C:\ssisdata\ShredRecordset.xlsx
  4. Přejmenujte proměnnou 4 na OutputFileName. Změňte typ dat z Int32 na String. Zde uděláme něco mírně pokročilého. Klikněte na proměnnou a stiskněte F4 pro zobrazení okna Vlastnosti. Změňte hodnotu EvaluateAsExpression na True. V Expression jej nastavte na "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (nebo jakýkoli váš soubor a cesta). Co to dělá, je konfigurovat proměnnou, která se mění se změnou hodnoty ParameterValue. To pomáhá zajistit, že získáme jedinečný název souboru. Konvenci pojmenování můžete podle potřeby změnit. Všimněte si, že je třeba kód \ ukončit kdykoli jste ve výrazu.

Správci připojení

Předpokládal jsem, že používáte správce připojení OLE DB. Můj se jmenuje FOO. Pokud používáte ADO.NET, koncepty budou podobné, ale budou existovat nuance týkající se parametrů a podobně.

Budete také potřebovat druhého Connection Manager pro práci s Excelem. Pokud je SSIS temperamentní, pokud jde o datové typy, Excel je přímo psychotický-bodne-vás-do-záda-vidličkou-když-spíš o datových typech. Počkáme a necháme datový tok skutečně vytvořit tento Connection Manager, abychom zajistili, že naše typy jsou dobré.

Zdrojový dotaz na sadu výsledků

SQL Load Recordset je instancí úlohy Execute SQL Task. Zde mám jednoduchý dotaz na napodobení vašeho zdroje.

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

Na kartě Obecné je důležité poznamenat, že jsem přepnul svou sadu výsledků z None na Full result set . Tím se karta Result Set změní ze šedé na použitelnou.

Můžete si všimnout, že jsem přiřadil název proměnné k proměnné, kterou jsme vytvořili výše (User::RecordSet) a Pokud je název výsledku 0 . To je důležité jako výchozí hodnota, NewResultName nefunguje.

FELC Shred Recordset

Uchopte kontejner Foreach Loop Container a ten použijeme ke „skartování“ výsledků, které byly vygenerovány v předchozím kroku.

Nakonfigurujte enumerátor jako Foreach ADO Enumerator Použijte User::RecordSet jako zdrojovou proměnnou vašeho objektu ADO. Vyberte rows in the first table jako režim výčtu

Na kartě Mapování proměnných budete muset vybrat svou proměnnou User::ParameterValue a přiřaďte mu index 0. Výsledkem bude, že nultý prvek v objektu sady záznamů bude přiřazen k proměnné ParametrValue. Je důležité, abyste měli dohodu o typu dat, protože SSIS zde nebude provádět implicitní převody.

FST Kopírovat šablonu

Toto je úkol systému souborů. Zkopírujeme naši šablonu Excel File, abychom měli dobře pojmenovaný výstupní soubor (má v něm název parametru). Nakonfigurujte jej jako

  • IsDestinationPathVariable:True
  • DestinationVarible:User::OutputFileName
  • OverwriteDestination:True
  • Operace:Kopírovat soubor
  • IsSourcePathVariable:True
  • SourceVariable:User::TemplateFile

Výstup generování DFT

Toto je úloha toku dat. Předpokládám, že pouze ukládáte výsledky přímo do souboru, takže budeme potřebovat pouze zdroj OLE DB a cíl Excel

OLEDB dbo_storedProcedure1

Zde se stahují vaše data z vašeho zdrojového systému s parametrem, který jsme skartovali v Control Flow. Napíšu sem svůj dotaz a použiji ? pro označení, že má parametr.

Změňte režim přístupu k datům na "Příkaz SQL" a do textu příkazu SQL, který je k dispozici, zadejte svůj dotaz

EXECUTE dbo.storedProcedure1 ?

Kliknu na tlačítko Parametry... a vyplním jej podle obrázku

  • Parametry:@parameterValue
  • Proměnné:User::ParameterValue
  • Směr parametrů:Vstup

Připojte cíl aplikace Excel ke zdroji OLE DB. Dvakrát klikněte a v části Správce připojení aplikace Excel klikněte na Nový... Určete, zda potřebujete formát 2003 nebo 2007 (.xls vs. .xlsx) a zda chcete, aby soubor měl řádky záhlaví. Pro cestu k souboru zadejte stejnou hodnotu, jakou jste použili pro proměnnou @User::TemplatePath, a klikněte na OK.

Nyní musíme vyplnit název listu Excel. Klikněte na tlačítko Nový... a může štěkat, že není dostatek informací o mapování datových typů. Nebojte se, je to polostandard. Poté se zobrazí definice tabulky něco jako

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

Název "tabulky" bude název listu, nebo přesně pojmenovaná datová sada v listu. Udělal jsem svůj List1 a kliknul na OK. Nyní, když list existuje, vyberte jej v rozevíracím seznamu. Jako název cílového listu jsem použil Sheet1$. Nejsem si jistý, jestli to má nějaký význam.

Klikněte na kartu Mapování a věci by se měly automaticky mapovat, takže klikněte na OK.

Konečně

V tomto okamžiku, pokud bychom balíček spustili, pokaždé by přepsal soubor šablony. Tajemství je v tom, že musíme říci, že Excel Connection Manager právě jsme udělali, že nemusí mít pevně zakódovaný název.

Klikněte jednou na Excel Connection Manager na kartě Connection Manager. V okně Vlastnosti vyhledejte Expressions a klikněte na tři tečky ... Zde nakonfigurujeme vlastnost ExcelFilePath a výraz, který použijeme, je@[User::OutputFileName]

Pokud vaše ikony a podobně vypadají jinak, dá se to očekávat. To bylo zdokumentováno pomocí SSIS 2012. Váš pracovní postup bude stejný v letech 2005 a 2008/2008R2, jen vzhled je jiný.

Pokud spustíte tento balíček a ani se nespustí a objeví se chyba o ACE 12 nebo Jet 4.0 něco není k dispozici, pak jste na 64bitovém stroji a potřebujete sdělit BIDS/SSDT, že chcete spustit 32bitový režimu.

Ujistěte se, že hodnota Run64BitRuntime je False . Toto nastavení projektu lze nalézt po kliknutí pravým tlačítkem na projekt, rozbalení vlastností konfigurace a bude to možnost v části Debugging.

Další čtení

Jiný příklad skartování objektu sady záznamů lze nalézt na Jak automatizovat provádění uložené procedury pomocí balíčku SSIS?




  1. Vytvoření uživatele na MySQL

  2. Produkt Microsoft Office, který odmítá zemřít

  3. Jak vytvářet a udržovat databáze MySQL v cPanel

  4. PostgreSQL Incremental Backup a Point-In-Time Recovery