Ich habe ein SSIS-Paket, das eine einfache SELECT
Anweisung 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.
Wenn ich die Abfrage in eine gespeicherte Prozedur verwandle und den Sproc in SSIS ausführe, erhalte ich eine Zeilenanzahl von 1.
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.
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.
Antworten:
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 ON
als erste Zeile Ihres SQL-Befehls hinzufügen:quelle
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_PROC
Nachrichten 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 ON
wird das Senden der DONE_IN_PROC- Nachrichten an den Client unterdrückt .quelle