Erfassen Sie die ersten Zeilen, die in der Transaktion betroffen sind, und weisen Sie der SSIS-variables zu

Ich laufe die folgende T-SQL-statement aus einer SSIS Execute T-SQL Statement Aufgabe:

 BEGIN TRANSACTION BEGIN TRY INSERT FooTable (...) SELECT ... FROM FooTableStaging ts WHERE NOT EXISTS ( SELECT id FROM FooTable WHERE id=ts.id ); -- reset staging table DELETE FROM FooTableStaging ; COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION ... END CATCH 

Wenn das Skript innerhalb von SSMS ausgeführt wird, gibt es zwei Zählungen zurück:

(69 Zeile (n) betroffen)

(217 Zeile (n) betroffen)

Wie erfasse ich die erste Zählung und ordne sie einer SSIS-Variable zu? Wäre nicht @@ROWCOUNT gleich 217 in diesem Szenario?

** bearbeiten **

Verwenden des OLE DB Verbindungstyps.

Es gibt wahrscheinlich ein paar Möglichkeiten, es zu tun, aber die einfachste in meinem Verstand wäre, die folgenden 3 neuen Linien zu Ihrem Skript hinzuzufügen

 -- line 1 Make a variable to hold the desired value DECLARE @NewRowCount int; BEGIN TRANSACTION BEGIN TRY INSERT FooTable (...) SELECT ... FROM FooTableStaging ts WHERE NOT EXISTS ( SELECT id FROM FooTable WHERE id=ts.id ); -- Line 2 Capture the intended count SELECT @NewRowCount = @@ROWCOUNT; -- reset staging table DELETE FROM FooTableStaging ; COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION ... END CATCH -- Line 3 Make a single row return statement SELECT @NewRowCount AS NewRowCount; 

Jetzt müssen Sie die Execute SQL Task "hören" die Zeile so ändern Sie den Ergebnis Set-Typ aus dem Standard von None to SingleRow . Klicken Sie auf der Registerkarte Ergebnismenge auf die Schaltfläche Hinzufügen, und der Ergebnisname von 0 wird auf Benutzer :: MyVariableCount oder was auch immer Sie es aufgerufen haben, zugeordnet.

T-SQL-statement ausführen und SQL-Task ausführen

In der SSIS-Domain stehen Ihnen zwei gleichnamige Aufgaben zur Verfügung. Die weitaus weit verbreitete Execute SQL Task und die Execute SQL Task Execute T-SQL Statement Task die unter der databasepflege / Andere Aufgaben (abhängig von Ihrer SSIS-Version) verfügbar ist.

Die Execute SQL Task kann einen OLE-, ODBC- oder ADO.NET-Verbindungsmanager verwenden. Die T-SQL-Task unterstützt nur ADO.NET-Verbindungsmanager.

Die Execute SQL Task hat die Möglichkeit, Parameter zu akzeptieren und Ergebnismengen zurückzugeben und eine SSIS Variable oder eine file als Abfragequelle zu verwenden. Die Execute T-TSQ Task akzeptiert keine Parameter, liefert keine Ausgabe und kann nur harte codierte Abfragen verwenden.

Angesichts der oben genannten, ich weiß, keine Situation, wo ich jemals verwenden die Execute T-SQL Statement Task über eine Execute SQL Task. Tauschen Sie Ihre vorhandene Aufgabe aus, um die SQL-Task auszuführen und Sie werden gut gehen. Ansonsten ist die Antwort nicht möglich.

Demo für das Erhalten von Resultset aus SQL-Task ausführen

Es funktioniert für mich, nicht sicher, welcher Fehler Sie mit dem Ausführen der SQL-Task ausführen, um eine einzelne Zeile Ergebnismenge zurückzugeben.

Bildbeschreibung hier eingeben

Um den process zu vereinfachen, habe ich alles übersprungen, aber die letzte Zeile in der oben genannten SQL, um meine Abfrage SELECT 1 AS NewRowCount;

Ich habe zwei SSIS-variables erstellt, User::RowCountNewADO und User::RowCountNewOLE beide Typ Int32

Meine Execute SQL Task ist wie dargestellt konfiguriert

Bildbeschreibung hier eingeben

Die Registerkarte Ergebnismenge wird so eingestellt

Bildbeschreibung hier eingeben

Versuch es selber

Es wäre nicht eine richtige SSIS-Antwort für mich, wenn ich nicht Demo Biml. Die Business Intelligence Markup Language, Biml, erlaubt mir, ein SSIS-Paket zu beschreiben, damit du es in deiner Umgebung neu erstellen kannst. Alles was Sie tun müssen, ist Download BIDS Helper Es ist ein kostenloses Add-on für Visual Studio, um mit Ihrem SSIS / SSRS / SSAS Entwicklungserfahrung zu helfen.

Nach der Installation klicken Sie mit der rechten Maustaste auf Ihr SSIS-Projekt und wählen Sie Neue Biml-file hinzufügen.

Fügen Sie das folgende in die BimlScript.biml-file ein

Bearbeiten Sie die Zeilen 3 und 4, um auf einen gültigen server zu verweisen (es sei denn, Sie führen eine benannte Instanz auf Ihrem lokalen Rechner von dev2014 ) und speichern Sie.

Klicken Sie mit der rechten Maustaste auf BimlScript.biml und wählen Sie SSIS-Pakete generieren aus

Sieg

 <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Connections> <AdoNetConnection Name="CM_ADO_DB" ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=msdb;" Provider="SQL" /> <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/> </Connections> <Packages> <Package Name="so_34443637" ConstraintMode="Linear"> <Variables> <Variable DataType="Int32" Name="RowCountNewADO">0</Variable> <Variable DataType="Int32" Name="RowCountNewOLE">0</Variable> </Variables> <Tasks> <ExecuteSQL ConnectionName="CM_ADO_DB" ResultSet="SingleRow" Name="SQL - Get Row Count ADO"> <DirectInput>SELECT 1 AS NewRowCount;</DirectInput> <Results> <Result VariableName="User.RowCountNewADO" Name="0" /> </Results> </ExecuteSQL> <ExecuteSQL ConnectionName="CM_OLE" ResultSet="SingleRow" Name="SQL - Get Row Count OLE"> <DirectInput>SELECT 1 AS NewRowCount;</DirectInput> <Results> <Result VariableName="User.RowCountNewOLE" Name="0" /> </Results> </ExecuteSQL> <ExecuteSQL ConnectionName="CM_OLE" Name="Breakpoint"> <DirectInput>SELECT 1 AS x;</DirectInput> </ExecuteSQL> </Tasks> </Package> </Packages> </Biml>