簡體   English   中英

SSIS 查詢與 rowcount 條件拆分寫入 0 行

[英]SSIS query with rowcount conditional split writes 0 rows

我有一個帶有簡單查詢的 OLE DB 源,它將一個平面 csv 文件寫入網絡。 如果我只這樣做,行會從源代碼寫入文件。 但是,如果有超過 0 行,我只想這樣做。

因此,我添加了一個變量 (apptCount) 和一個條件拆分。 (第一次使用這些)數據查看器顯示行在 oledb 數據源和映射到變量 apptCount 的行計數 object 之間數據查看器顯示行也在行計數 object 和條件拆分 ZA8CFDE6331BD59EB2AC96F9668 之間在有條件的吐口水中,我將案例 1 設置為 @[User::apptCount]>0

但是,沒有行寫入 csv 文件。 任何幫助表示贊賞。 /jb

只有在數據流開始和完成時才會讀取/寫入變量。 當 DF 正在運行時,條件拆分將在數據流開始之前使用@[User::apptCount]的值(可能是設計時值 0,除非您以其他方式對其進行初始化)。

您的選擇是運行兩次查詢(執行 SQL 任務以獲取預期的行數),然后根據需要啟用/禁用 DF。 或者讓它 OLEDB 源 -> 行計數 -> 平面文件目標,然后有一個條件文件系統任務 go 如果行計數變量為零,則刪除該文件。

您還可以檢查,因為如果 DF 啟動,我認為它會將您的 output 初始化為一個空文件,這可能是您系統的預期行為,也可能不是。 如果文件的存在意味着您有數據,那么消費者可能會失望地看到它是空的。

滾動您自己的行數轉換

作為一個思想實驗,讓我們將行計數轉換實現為腳本組件。 這是一個微不足道的組件。

將行計數變量@[User::apptCount]添加到 ReadWriteVariables 集合

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    int mRowCount;

    public override void PreExecute()
    {
        base.PreExecute();
        this.mRowCount = 0;
    }

    public override void PostExecute()
    {
        base.PostExecute();
        this.Variables.apptCount = this.mRowCount;
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        mRowCount++;
    }
}

而已。 1 個局部變量,我們在 PreExecute 中初始化的PreExecute 在 PostExecuted 中,我們將局部成員變量的值分配給我們傳入的全局/SSIS 變量。在 *ProcessInputRow 方法中,我們只是增加成員變量。

如果您嘗試在 Pre/Post Execute 之外的任何地方訪問或修改 apptCount 的值,則它將無法正常工作。 我認為在某一時刻(2005 天),它可以讓你這樣做,但不會發生任何變化,但現在我認為它正確地引發了異常。 數據查看器可能正在做類似的事情。 它批量處理 100 行或其他任何內容並將它們顯示在網格框中,但這只是內部/成員變量。 數據查看器無法執行“將此行發送到錯誤路徑”之類的操作。 這只是檢查。

SSIS 執行引擎設計為 go 可以並行。 除了像 PostExecute 這樣的協調/線程安全方法外,沒有辦法讓內部部分暴露給外部部分。

我想如果你願意,你可以編寫一個異步腳本組件,如果至少收到一行,它只向 output 緩沖區發送行。 我不會那樣做的。 這是一個沒有任何好處的維護和繁瑣的編碼,但它是一種選擇。

這不起作用,所以我退出並直接在執行 sql 事件中設置變量,使用控制流中的 returnValue 然后使用表達式約束。 比嘗試在數據流中設置行數要容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM