измените row_number()
на dense_rank()
, чтобы получить желаемые результаты:
select distinct
_row_ord = 100,
_client_id = c.client_id,
_segment = 'fake',
--_row = row_number() over(order by c.client_id)
_value =
concat
(
'HL*',
dense_rank() over(order by c.client_id) + 1 ,'*',
'testfield','~'
)
Результаты:
_row_ord _client_id _segment _value
100 1991 fake HL*2*testfield~
100 1992 fake HL*3*testfield~
Да, закрытие любого Устройства записи/Читателя закроет все другие Устройства записи и Средства чтения, которые они переносят. Не закрывайте его, пока Вы не будете готовы закрыть базовый сокет.
Как @Eddie сказал (за секунды до меня! :)), закрытие устройства записи и/или средства чтения закроет базовые потоки сокета и сам сокет : Однако, я верю самому сокету, не будет закрыт .
Закрытие возвращенного InputStream закроет связанный сокет.
Вы не должны закрывать устройство записи, ни средство чтения. Просто сбросьте устройство записи, чтобы удостовериться, что Ваши сообщения прибудут вовремя. Закрытие сокета позже закроет соответствующие потоки, таким образом, Вы не должны будете закрывать их сами. Просто оставьте свои объекты читателя/устройства записи GC.
Другая альтернатива должна создать себя фильтры NoCloseInputStream и NoCloseOutputStream, которые просто ничего не делают на завершении; затем используйте их для обертывания потоков сокета приложения (перед любым приложением wrappering как буфер).
Примечание, что, если бы необходимо было сделать это, необходимо было бы сохранить ссылку на сокет (или перенесенные потоки) так, чтобы можно было закрыть сокет, когда Вы на самом деле сделаны с ним.
Для ответа на комментарий, что это "слишком совершенствуется понятие для OP": проблема OP состоит в том, что в закрытии высокоуровневого потока, он также закрывает базовый сокет, но это бесполезно, так как он хочет создать дальнейшие потоки верхнего уровня по сокету для отправки дальнейших сообщений. В зависимости от его архитектуры единственный способ достигнуть это может быть должно перенести потоки в обертки NoClose - например, он может передавать потоки сериализатору XML или deserializer, который закрывает поток, когда это сделано, который близко является за пределами его управления.