Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie übergebe ich einen Wert an einen Parameter einer gespeicherten Prozedur in der OLE DB-Quellkomponente?

Konzeptionell sieht Ihre Lösung so aus, dass Sie Ihre Quellabfrage ausführen, um Ihre Ergebnismenge zu generieren. Speichern Sie das in einer Variablen und dann müssen Sie diese Ergebnisse durchlaufen und für jede Zeile Ihre gespeicherte Prozedur mit dem Wert dieser Zeile aufrufen und die Ergebnisse in eine neue Excel-Datei senden.

Ich würde mir vorstellen, dass Ihr Paket ungefähr so ​​aussieht

Eine Aufgabe zum Ausführen von SQL mit dem Namen „SQL Load Recordset“, die an einen Foreach-Schleifencontainer mit dem Namen „FELC Shred Recordset“ angehängt ist. Darin eingebettet habe ich eine Dateisystemaufgabe mit dem Namen "FST Copy Template", die eine Präzedenz für eine Datenflussaufgabe mit dem Namen "DFT Generate Output" ist.

Einrichten

Da Sie ein Anfänger sind, werde ich versuchen, es im Detail zu erklären. Um sich Ärger zu ersparen, besorgen Sie sich eine Kopie von BIDSHelper. Es ist ein kostenloses Open-Source-Tool, das das Designerlebnis in BIDS/SSDT verbessert.

Variablen

Klicken Sie auf den Hintergrund Ihres Kontrollflusses. Wenn nichts ausgewählt ist, klicken Sie mit der rechten Maustaste und wählen Sie Variablen aus. Klicken Sie im neuen Fenster, das sich öffnet, viermal auf die Schaltfläche, die eine neue Variable erstellt. Der Grund für das Klicken auf nichts ist, dass bis SQL Server 2012 das Standardverhalten der Variablenerstellung darin besteht, sie im Bereich des aktuellen Objekts zu erstellen. Dies hat zu vielen verlorenen Haaren für neue und erfahrene Entwickler gleichermaßen geführt. Bei Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden, also achten Sie auch darauf.

  1. Variable in RecordSet umbenennen. Ändern Sie den Datentyp von Int32 in Object
  2. Variable1 in ParameterWert umbenennen. Ändern Sie den Datentyp von Int32 in String
  3. Variable2 in TemplateFile umbenennen. Ändern Sie den Datentyp von Int32 in String. Legen Sie den Wert auf den Pfad Ihrer Excel-Ausgabedatei fest. Ich habe C:\ssisdata\ShredRecordset.xlsx
  4. verwendet
  5. Variable 4 in OutputFileName umbenennen. Ändern Sie den Datentyp von Int32 in String. Hier machen wir etwas leicht Fortgeschrittenes. Klicken Sie auf die Variable und drücken Sie F4, um das Eigenschaftenfenster aufzurufen. Ändern Sie den Wert von EvaluateAsExpression in True. Legen Sie es in Ausdruck auf "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (oder was auch immer Ihre Datei und Ihr Pfad sind). Dadurch wird eine Variable so konfiguriert, dass sie sich ändert, wenn sich der Wert von ParameterValue ändert. Dadurch wird sichergestellt, dass wir einen eindeutigen Dateinamen erhalten. Sie können die Namenskonvention nach Bedarf ändern. Beachten Sie, dass Sie \ maskieren müssen immer wenn Sie sich in einem Ausdruck befinden.

Verbindungsmanager

Ich bin davon ausgegangen, dass Sie einen OLE DB-Verbindungsmanager verwenden. Meine heißt FOO. Wenn Sie ADO.NET verwenden, sind die Konzepte ähnlich, aber es gibt Nuancen in Bezug auf Parameter und dergleichen.

Sie benötigen außerdem einen zweiten Connection Manager für die Handhabung von Excel. Wenn SSIS in Bezug auf Datentypen temperamentvoll ist, ist Excel geradezu psychotisch und sticht Ihnen mit einer Gabel in den Rücken, während Sie über Datentypen schlafen. Wir werden warten und den Datenfluss diesen Verbindungsmanager tatsächlich erstellen lassen, um sicherzustellen, dass unsere Typen gut sind.

Quellabfrage zu Ergebnissatz

Das SQL Load Recordset ist eine Instanz des Tasks „SQL ausführen“. Hier habe ich eine einfache Abfrage, um Ihre Quelle nachzuahmen.

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

Was auf der Registerkarte Allgemein zu beachten ist, ist, dass ich mein ResultSet von None umgestellt habe zu Full result set . Dadurch wird die Registerkarte „Ergebnissatz“ nicht mehr ausgegraut, sondern kann verwendet werden.

Sie können beobachten, dass ich den Variablennamen der oben erstellten Variablen zugewiesen habe (User::RecordSet) und I der Ergebnisname ist 0 . Das ist als Standardwert wichtig, NewResultName funktioniert nicht.

FELC-Shred-Datensatz

Schnappen Sie sich einen Foreach-Loop-Container und wir werden diesen verwenden, um die Ergebnisse zu „shreddern“, die im vorherigen Schritt generiert wurden.

Konfigurieren Sie den Enumerator als Foreach ADO Enumerator Verwenden Sie User::RecordSet als Ihre ADO-Objektquellvariable. Wählen Sie rows in the first table aus als Aufzählungsmodus

Auf der Registerkarte Variablenzuordnungen müssen Sie Ihre Variable User::ParameterValue auswählen und weisen Sie ihm den Index 0 zu. Dies führt dazu, dass das nullte Element in Ihrem Recordset-Objekt der Variablen ParameterValue zugewiesen wird. Es ist wichtig, dass Sie eine Datentypvereinbarung haben, da SSIS hier keine impliziten Konvertierungen durchführt.

FST-Kopiervorlage

Dies ist eine Dateisystemaufgabe. Wir werden unsere Excel-Vorlagendatei kopieren, sodass wir eine gut benannte Ausgabedatei haben (die den Parameternamen enthält). Konfigurieren Sie es als

  • IsDestinationPathVariable:True
  • Zielvariable:Benutzer::Ausgabedateiname
  • Ziel überschreiben:True
  • Vorgang:Datei kopieren
  • IsSourcePathVariable:True
  • Quellvariable:Benutzer::Vorlagendatei

DFT-Ausgabe generieren

Dies ist eine Datenflussaufgabe. Ich gehe davon aus, dass Sie die Ergebnisse einfach direkt in eine Datei ausgeben, also brauchen wir nur eine OLE DB-Quelle und ein Excel-Ziel

OLEDB dbo_storedProcedure1

Hier werden Ihre Daten aus Ihrem Quellsystem mit den Parametern gezogen, die wir im Kontrollfluss geschreddert haben. Ich werde meine Abfrage hier hineinschreiben und den ? verwenden um anzuzeigen, dass es einen Parameter hat.

Ändern Sie Ihren Datenzugriffsmodus in "SQL-Befehl" und geben Sie Ihre Abfrage in den verfügbaren SQL-Befehlstext ein

EXECUTE dbo.storedProcedure1 ?

Ich klicke auf die Schaltfläche Parameter... und fülle sie wie gezeigt aus

  • Parameter:@parameterValue
  • Variablen:User::ParameterValue
  • Param Richtung:Eingabe

Verbinden Sie ein Excel-Ziel mit der OLE DB-Quelle. Doppelklicken Sie und klicken Sie im Abschnitt Excel-Verbindungsmanager auf Neu... Legen Sie fest, ob Sie das Format 2003 oder 2007 (.xls oder .xlsx) benötigen und ob Ihre Datei Kopfzeilen enthalten soll. Geben Sie für Ihren Dateipfad denselben Wert ein, den Sie für Ihre Variable @User::TemplatePath verwendet haben, und klicken Sie auf OK.

Wir müssen jetzt den Namen der Excel-Tabelle eingeben. Klicken Sie auf die Schaltfläche Neu ... und es kann angezeigt werden, dass nicht genügend Informationen zum Zuordnen von Datentypen vorhanden sind. Keine Sorge, das ist Semi-Standard. Es wird dann eine Tabellendefinition in der Art von

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

Der Name der "Tabelle" ist der Name des Arbeitsblatts oder genau der benannte Datensatz im Arbeitsblatt. Ich habe mein Sheet1 erstellt und auf OK geklickt. Nachdem das Blatt nun vorhanden ist, wählen Sie es in der Dropdown-Liste aus. Ich habe mich für Sheet1$ als Namen des Zielblatts entschieden. Ich bin mir nicht sicher, ob es einen Unterschied macht.

Klicken Sie auf die Registerkarte Mappings und die Dinge sollten sich automatisch zuordnen lassen, also klicken Sie auf OK.

Endlich

Wenn wir das Paket zu diesem Zeitpunkt ausführen, wird die Vorlagendatei jedes Mal überschrieben. Das Geheimnis ist, dass wir diesen Excel Connection Manager mitteilen müssen Wir haben nur festgelegt, dass es keinen fest codierten Namen haben muss.

Klicken Sie einmal auf den Excel Connection Manager auf der Registerkarte Connection Managers. Suchen Sie im Eigenschaftenfenster nach Expressions Abschnitt und klicken Sie auf die Auslassungspunkte ... Hier konfigurieren wir die Eigenschaft ExcelFilePath und der Ausdruck, den wir verwenden werden, ist @[User::OutputFileName]

Wenn Ihre Symbole und dergleichen anders aussehen, ist das zu erwarten. Dies wurde mit SSIS 2012 dokumentiert. Ihr Arbeitsablauf wird in 2005 und 2008/2008R2 gleich sein, nur der Skin ist anders.

Wenn Sie dieses Paket ausführen und es nicht einmal startet und ein Fehler bezüglich ACE 12 oder Jet 4.0 auftritt, ist etwas nicht verfügbar, dann befinden Sie sich auf einem 64-Bit-Computer und müssen BIDS/SSDT mitteilen, dass Sie es in 32 Bit ausführen möchten Modus.

Stellen Sie sicher, dass der Run64BitRuntime-Wert False ist . Diese Projekteinstellung finden Sie, indem Sie mit der rechten Maustaste auf das Projekt klicken, die Konfigurationseigenschaften erweitern und es wird eine Option unter Debugging sein.

Weiterführende Literatur

Ein anderes Beispiel für das Schreddern eines Recordset-Objekts finden Sie unter Wie man die Ausführung einer gespeicherten Prozedur mit einem SSIS-Paket automatisiert?