Можно усилить таблицу Number, чтобы сделать строковый парсинг.
Составляют физическую таблицу чисел:
create table dbo.Numbers (N int primary key);
insert into dbo.Numbers
select top 1000 row_number() over(order by number) from master..spt_values
go
Составляют тестовую таблицу с 1 000 000 строк
create table #yak (i int identity(1,1) primary key, array varchar(50))
insert into #yak(array)
select 'a,b,c' from dbo.Numbers n cross join dbo.Numbers nn
go
, Создают функцию
create function [dbo].[ufn_ParseArray]
( @Input nvarchar(4000),
@Delimiter char(1) = ',',
@BaseIdent int
)
returns table as
return
( select row_number() over (order by n asc) + (@BaseIdent - 1) [i],
substring(@Input, n, charindex(@Delimiter, @Input + @Delimiter, n) - n) s
from dbo.Numbers
where n <= convert(int, len(@Input)) and
substring(@Delimiter + @Input, n, 1) = @Delimiter
)
go
Использование (выходные строки 3 миллиметров в 40-х на моем ноутбуке)
select *
from #yak
cross apply dbo.ufn_ParseArray(array, ',', 1)
очистка
drop table dbo.Numbers;
drop function [dbo].[ufn_ParseArray]
, Производительность здесь не удивительна, но вызывание функции, более чем миллион таблиц строки не является лучшей идеей. При выполнении строкового разделения по поводу многих строк я избежал бы функции.
Практически точно это мы делаем на моей работе. В настоящее время мы застряли на java 5 из-за некоторых внутренних ограничений, поэтому мы делаем это немного по-другому, используя Service Provider (из-за отсутствия доступа к ServiceLocator до java 6, как вы упомянули), но по сути он работает так же.
Я помню, как где-то читал, что это был один из предпочтительных способов, рекомендуемых разработчиками Guice, хотя они хотят оставить его открытым для гибкости.
Я уже рассматривал этот способ, но не использовал его, потому что боялся, что мне придется делать модули очень маленькими, потому что их невозможно связать интерфейс дважды. Моя проблема заключается в том, что если я хочу использовать интерфейс / класс / перечисление / что-либо из другой банки, и эта банка определяет файл services / *, мне не нравится, потому что я не могу использовать содержимое банки, не загружая его как модуль.
Надеюсь, мои опасения понятны.