Datenflussaufgabe erzeugt keine Zeilen mit Deklarationsanweisung

7

Ich habe ein SSIS-Paket, das eine einfache SELECTAnweisung ausführt und dann in eine Tabelle lädt. Ich habe die SQL-Anweisung anonymisiert, was schmerzlich offensichtlich sein sollte, wenn Sie sich den Tabellennamen ansehen. Ich habe das Paket auch vereinfacht, um nur eine Zeilenzählung für die Zwecke dieser Demo durchzuführen.

Ich habe das Problem, dass die Abfrage Zeilen in SQL Server erzeugt, aber keine Zeilen in SSIS. Die Abfrage lautet wie folgt.

DECLARE @CurrentBlahDate DATETIME
SET @CurrentBlahDate = ( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' ))
SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(@CurrentBlahDate AS DATE)

Bitte ignorieren Sie das *, da dies nur für die Zwecke dieser Demo ist. Die eigentliche Abfrage hat das gleiche Problem, obwohl sie nicht das * hat. Bei Ausführung in SQL Server wird erwartungsgemäß 1 Zeile aus der Kalendertabelle zurückgegeben. Bei Ausführung in derselben Umgebung in SSIS werden jedoch keine Zeilen zurückgegeben.

SSIS

Wenn ich die Abfrage in eine gespeicherte Prozedur verwandle und den Sproc in SSIS ausführe, erhalte ich eine Zeilenanzahl von 1.

1Row

Wenn ich die Abfrage dazu ändere.

SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' )) AS DATE)

Dann erhalte ich noch einmal 1 Zeile.

1 weitere Reihe

Gibt es einen Grund, warum ich dieses Verhalten sehe?

UPDATE: Bevor ich dafür eine Menge Flack bekomme, habe ich keine Wahl für den NOLOCK-Unsinn.

Zane
quelle
5
Ich würde Sie persönlich über das "CAST (BaseDate AS DATE)"
informieren
Lol noch einmal das ist verschleiert.
Zane

Antworten:

10

Nun, obwohl ich den Grund für dieses Verhalten nicht kenne , erinnere ich mich, dass ich vor einiger Zeit darüber gelesen habe und was ich tun muss, um es zu beheben. Damit dies funktioniert, müssen Sie nur SET NOCOUNT ONals erste Zeile Ihres SQL-Befehls hinzufügen:

SET NOCOUNT ON
DECLARE @CurrentBlahDate DATETIME
SET @CurrentBlahDate = ( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' ))
SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(@CurrentBlahDate AS DATE)
Lamak
quelle
1
Das funktioniert großartig, danke. Wenn jedoch jemand eine Erklärung dafür hat, würde ich mich freuen, sie zu hören.
Zane
4

Lamak hat die Frage beantwortet.

Der Grund könnte sein, dass die OLEDB während der Paketlaufzeit die erste Ergebnismenge verarbeitet. Wenn der Befehl eine Variable enthält, werden die DONE_IN_PROCNachrichten als leere Ergebnismengen zurückgegeben. Die OLEDB-Quelle nimmt also die erste Ergebnismenge und fährt fort, was dazu führt, dass das Paket erfolgreich ist, jedoch ohne Zeilen.

Wie Lamak betonte, SET NOCOUNT ONwird das Senden der DONE_IN_PROC- Nachrichten an den Client unterdrückt .

Kin Shah
quelle