Как определить последнюю строку набора строк для дальнейшей обработки во время потока данных?

У меня проблема с потоком данных SSIS 2014. Мне нужно определить последнюю строку набора строк во время потока данных. Мне это нужно для дальнейшей обработки внутри того же потока данных. Используя компонент сценария, я попробовал функции NextRow() и EndOfRowset(). Однако эти функции работают ненадежно, используя следующий код:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (!Row.NextRow()) // never true.
    {
        MessageBox.Show("last row");
    }

    if (Row.EndOfRowset()) // never true.
    {
        MessageBox.Show("last row");
    }
}

причины заключаются в некоторых проблемах с размером буфера, как вы можете прочитать здесь: не работает? forum=sqlintegrationservices" rel="nofollow">http://social.msdn.microsoft.com/Forums/sqlserver/en-US/b07c5324-56ff-48dc-991c-3947aecf1558/endofrowset-doesnt-work? forum=sqlintegrationservices

Поэтому я попытался измерить количество строк, чтобы определить последнюю строку. К сожалению, преобразование количества строк присваивает определенное количество строк переменной при обработке всех строк. Поэтому я не могу использовать его во время потока данных.

Как мне определить последнюю строку во время потока данных, чтобы я мог обрабатывать эту строку по отдельности?


person 17nxo    schedule 19.08.2014    source источник
comment
Можно ли определить его перед потоком данных, либо включив столбец isLast в выходные данные запроса, либо выполнив запрос COUNT в задаче executeSQL?   -  person Tab Alleman    schedule 19.08.2014
comment
Здравствуйте Tab Alleman, поскольку я не нашел решения, как определить последнюю строку во время потока данных, я сделал это таким образом, используя преобразование количества строк в предыдущем потоке данных. Это также подходило для решения моей проблемы. Спасибо за помощь!   -  person 17nxo    schedule 21.08.2014


Ответы (1)


Вы захотите сделать это в методе Input0_ProcessInput. Попробуйте протестировать этот код в компоненте скрипта:

public override void Input0_ProcessInput(Input0Buffer Row)
    {
        base.Input0_ProcessInput(Row);

        //Will be true this time
        if (Row.EndOfRowset())
        {
            MessageBox.Show("Last Row");
        }
    }
person jymbo    schedule 24.08.2014
comment
Спасибо за ваш ответ и извините за мой поздний ответ. Я попробовал ваше решение, но не могу получить доступ к значениям столбца последней строки в вашем предложении if. например когда я помещаю MessageBox.Show("last row: " + Row.idColumn) в предложение if, я получаю сообщение об ошибке PipelineBuffer обнаружил недопустимое значение индекса строки, хотя входной столбец был активирован (и доступен в методе Input0_ProcessInputRow). Моя цель - присвоить значение Row.idColumn глобальной переменной. - person 17nxo; 19.09.2014
comment
Это сработало для меня! Сначала не понял, что вы говорите о функции Input0_ProcessInput, а не о Input0_ProcessInputRow, которая автоматически добавляется в исходный код в компоненте Script, и по какой-то причине EndOfRowset там не работает. Поэтому добавьте указанную выше функцию, и вы сможете вызывать существующую функцию ProcessInputRow (если хотите) в цикле While (Row.NextRow()). Затем проверьте EndOfRowset после завершения цикла While. - person Kelly; 11.07.2017