powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена символов в строке
25 сообщений из 33, страница 1 из 2
Замена символов в строке
    #40075545
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Мне нужно изменить строки типа
1ABCD
1AC
1ACE
2A
2AC
на
1A,1B,1C,1D
1A,1C
1A,1C,1E
2A
2A,2C

Можно ли это сделать при помощи обычной функции REPACE или нужно писать цикл?

В общем как это проще всего сделать?

Спасибо.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075547
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

если это надо сделать один раз, то сделайте это циклом, экспортируйте в текст, потом поправьте как надо и импортируйте обратно, натравите внешний скрипт обновляющий данные

если это надо делать постоянно, не храните данные так, используйте триггер или парсите это в приложении перед вставкой
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075553
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
declare @t table (id integer identity, txt varchar(100))

insert into @t (txt) values
('1ABCD'),
('1AC'),
('1ACE'),
('2A'),
('2AC')

;with cte as (
	select
		t.id,
		t.txt,
		a.number,
		a.ch
	from @t t
	cross apply (select v.number, substring(t.txt, 1+v.number, 1) as ch from master..spt_values v 
                          where v.number < len(t.txt) and v.type = 'P') a
)
select
	t1.id,
	t1.ch + t2.ch as xz
from cte t1 inner join cte t2 on t1.id=t2.id 
where t1.number = 0 and t2.number <> 0
order by t1.id, t2.number 


idxz11A11B11C11D21A21C31A31C31E42A52A52C
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075555
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даа, и "склеить" обратно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare @t table (id integer identity, txt varchar(100))

insert into @t (txt) values
('1ABCD'),
('1AC'),
('1ACE'),
('2A'),
('2AC')

;with cte as (
	select
		t.id,
		t.txt,
		a.number,
		a.ch
	from @t t
	cross apply (select v.number, substring(t.txt, 1+v.number, 1) as ch from master..spt_values v 
                           where v.number < len(t.txt) and v.type = 'P') a
)
select
	t1.id,
	string_agg(t1.ch + t2.ch, ',') within group(order by t2.number) as xz
from cte t1 inner join cte t2 on t1.id=t2.id 
where t1.number = 0 and t2.number <> 0
group by t1.id
order by t1.id


idxz11A,1B,1C,1D21A,1C31A,1C,1E42A52A,2C
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075559
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @t table (id integer identity, txt varchar(100));

insert into @t (txt) values
('1ABCD'),
('1AC'),
('1ACE'),
('2A'),
('2AC')

declare @n int = ( select max(len(txt)) from @t );

while @n > 2 begin

  update @t set txt = stuff(txt, @n, 0, ',' + left(txt, 1) )
    where len(txt) >= @n;

  set @n = @n - 1;

end;

select * from @t;
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075690
MaksK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
CREATE FUNCTION dbo.Replacetxt (@TXT AS NVARCHAR(50))
RETURNS NVARCHAR(250)
AS
BEGIN
	DECLARE @Text NVARCHAR(250)= ''

	SELECT
		@Text= REPLACE(REPLACE(@Text + QUOTENAME(C), '[', ''), ']', '')
	FROM
		(
		SELECT T, IIF(R= 1, A+B,','+A+B) C
		FROM
			(
				SELECT
					ROW_NUMBER() OVER (ORDER BY @TXT) R
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) T
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) A, SUBSTRING(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''),number,1) B
				FROM MASTER.dbo.spt_values
				WHERE TYPE='P' AND NUMBER BETWEEN 1 AND LEN(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''))
			) D
		) TB

	RETURN @Text
END



declare @t table (id integer identity, txt varchar(100));

insert into @t (txt) values
('1ABCD'),
('1AC'),
('1ACE'),
('2A'),
('2AC')

SELECT ID, dbo.Replacetxt(TXT)
FROM @T




Модератор: Используйте tag SRC
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075714
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

авторкак это проще всего сделать

Проще всего создать несколько CLR функций для работы с регулярными выражениями, в инете полно описаний.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075729
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Roust_m,

авторкак это проще всего сделать


Проще всего создать несколько CLR функций для работы с регулярными выражениями, в инете полно описаний.
Глупо.
Эти функции производят массу лишней вычислительной работы.

ЗЫ. Зря, что-ли, мелкософт не вводит в T-SQL такие "функции".
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075754
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пиписькомер :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort, nocount on;
go

CREATE or alter FUNCTION dbo.Replacetxt (@TXT AS NVARCHAR(50))
RETURNS NVARCHAR(250)
AS
BEGIN
	DECLARE @Text NVARCHAR(250)= ''

	SELECT
		@Text= REPLACE(REPLACE(@Text + QUOTENAME(C), '[', ''), ']', '')
	FROM
		(
		SELECT T, IIF(R= 1, A+B,','+A+B) C
		FROM
			(
				SELECT
					ROW_NUMBER() OVER (ORDER BY @TXT) R
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) T
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) A, SUBSTRING(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''),number,1) B
				FROM MASTER.dbo.spt_values
				WHERE TYPE='P' AND NUMBER BETWEEN 1 AND LEN(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''))
			) D
		) TB

	RETURN @Text
END
go

declare @r table (descr varchar(50), elapsed_time_ms int);

drop table if exists #t;
create table #t (id integer identity primary key, txt varchar(100));

insert into #t (txt)
select
 d.s
from
 (select top (50000) a.number from master.dbo.spt_values a cross join master.dbo.spt_values b) c cross apply
 (values ('1ABCD'), ('1AC'), ('1ACE'), ('2A'), ('2AC'), ('3ABCDEFGHIJKLMNOPQRSTUVWXYZ')) d(s);

declare @dt datetime2 ;

begin tran;

set @dt = sysdatetime();
declare @n int = ( select max(len(txt)) from #t );

while @n > 2 begin

  update #t set txt = stuff(txt, @n, 0, ',' + left(txt, 1) )
    where len(txt) >= @n;

  set @n = @n - 1;

end;

insert into @r
select 'cycle by aleks222', datediff(ms, @dt, sysdatetime());

rollback;

begin tran;

set @dt = sysdatetime();

update #t
 set
  txt = stuff(RegexpReplaceWrapper(substring(txt, 2, cast(0x7fffffff as int)), '(.{1})', ',' + left(txt, 1) + '$1', 'default'), 1, 1, '')
from
 #t;

insert into @r
select 'RegexpReplace wrapper', datediff(ms, @dt, sysdatetime());

rollback;

begin tran;

set @dt = sysdatetime();

with x as
(
 select
  t.txt, b.txt_new
 from
  #t t cross apply
  (
   select
    string_agg(a.s, ',') within group (order by a.rn)
   from
    (
     select top (len(t.txt) - 1)
      row_number() over (order by 1/0) as rn,
      left(t.txt, 1) + substring(t.txt, row_number() over (order by 1/0) + 1, 1)
     from
      master.dbo.spt_values
    ) a(rn, s)
  ) b(txt_new)
)
update x
 set
  txt = txt_new;

insert into @r
select 'split and string_agg b invm', datediff(ms, @dt, sysdatetime());

rollback;

begin tran;

set @dt = sysdatetime();

;with cte as (
	select
		t.id,
		t.txt,
		a.number,
		a.ch
	from #t t
	cross apply (select v.number, substring(t.txt, 1+v.number, 1) as ch from master..spt_values v 
                           where v.number < len(t.txt) and v.type = 'P') a
),
s as
(
 select
 	t1.id,
 	string_agg(t1.ch + t2.ch, ',') within group(order by t2.number) as xz
 from cte t1 inner join cte t2 on t1.id=t2.id 
 where t1.number = 0 and t2.number <> 0
 group by t1.id
)
update t
 set
  txt = s.xz
from
 s join
 #t t on t.id = s.id;

insert into @r
select 'by court', datediff(ms, @dt, sysdatetime());

rollback;

begin tran;

set @dt = sysdatetime();

update #t set txt = dbo.Replacetxt(txt);

insert into @r
select 'scalar function by MaksK', datediff(ms, @dt, sysdatetime());

rollback;

select * from @r order by elapsed_time_ms;
go

drop function dbo.Replacetxt;
go


descrelapsed_time_mssplit and string_agg b invm1231cycle by aleks2223482RegexpReplace wrapper4347by court13766scalar function by MaksK15643
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075755
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если соревноваться "на скорость" - надо немного индексов дописать.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075758
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
----
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075766
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Если соревноваться "на скорость" - надо немного индексов дописать.
Например?
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075785
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

речь шла о "проще", а не "быстро". Проще - регулярные выражения, вне конкуренции.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075809
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
aleks222,

речь шла о "проще", а не "быстро". Проще - регулярные выражения, вне конкуренции.

Иллюзия.
У каждого "свое регулярное выражение".
Сколько раз я сталкивался с необходимостью править - стока раз и отгребал немерянный геморрой.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075810
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
aleks222
Если соревноваться "на скорость" - надо немного индексов дописать.
Например?

доп. поле N = длине исходного текста
+ кластерный индекс по этому полю
+ where N <= @n
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075816
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
доп. поле N = длине исходного текста
+ кластерный индекс по этому полю
+ where N <= @n
Такой индекс добавит в план расходов на устранение потенциальной hallowin problem. Так что для данного конкретного случая возможно даже ухудшение, а не улучшение производительности.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40075989
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Если соревноваться "на скорость" - надо немного индексов дописать.


Не, скорость не нужна, ибо там всего 2-3 тысячи записей. Нужна простота, чтобы поменьше кода и багов было.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076019
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

при использовании регулярных выражений это будет всего одна строка, что-то вроде написанного выше (выражение можно упростить):

Код: sql
1.
2.
declare @txt varchar(100) = '1ASDF';
select STUFF(dbo.RegexReplace(@txt, '.', ',' + left(@txt, 1) + '$0'), 1, 4, '');
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076043
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Roust_m,

при использовании регулярных выражений это будет всего одна строка, что-то вроде написанного выше (выражение можно упростить):

Код: sql
1.
2.
declare @txt varchar(100) = '1ASDF';
select STUFF(dbo.RegexReplace(@txt, '.', ',' + left(@txt, 1) + '$0'), 1, 4, '');



Проблема не в "одной строке" - проблема в голове.

Код: sql
1.
while @n > 2 begin update @t set txt = stuff( txt, @n, 0, ',' + left(txt, 1) )  where len(txt) >= @n; set @n = @n - 1; end;
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076047
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доработанный "писькомер", с учетом пожелания алекса и замечания Владислава Колосова
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort, nocount on;
go

CREATE or alter FUNCTION dbo.Replacetxt (@TXT AS NVARCHAR(50))
RETURNS NVARCHAR(250)
AS
BEGIN
	DECLARE @Text NVARCHAR(250)= ''

	SELECT
		@Text= REPLACE(REPLACE(@Text + QUOTENAME(C), '[', ''), ']', '')
	FROM
		(
		SELECT T, IIF(R= 1, A+B,','+A+B) C
		FROM
			(
				SELECT
					ROW_NUMBER() OVER (ORDER BY @TXT) R
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) T
					,SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)) A, SUBSTRING(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''),number,1) B
				FROM MASTER.dbo.spt_values
				WHERE TYPE='P' AND NUMBER BETWEEN 1 AND LEN(REPLACE(@TXT, SUBSTRING(@TXT, 0, PATINDEX('%[^0-9]%', @TXT)), ''))
			) D
		) TB

	RETURN @Text
END
go

drop table if exists #t;

create table #t (id integer identity, txt varchar(100), l as len(txt) persisted);

insert into #t (txt)
select
 d.s
from
 (select top (50000) a.number from master.dbo.spt_values a cross join master.dbo.spt_values b) c cross apply
 (values ('1ABCD'), ('1AC'), ('1ACE'), ('2A'), ('2AC'), ('3ABCDEFGHIJKLMNOPQRSTUVWXYZ')) d(s);

--create clustered index IX_t__l on #t(l);

begin tran;

declare @n int = ( select max(l) from #t );

while @n > 2 begin

  update/*cycle by aleks222*/ #t set txt = stuff(txt, @n, 0, ',' + left(txt, 1) )
    where l >= @n;

  set @n = @n - 1;

end;

rollback;

begin tran;

update /*RegexpReplace wrapper*/ #t
 set
  txt = stuff(RegexpReplace(substring(txt, 2, cast(0x7fffffff as int)), '.', ',' + left(txt, 1) + '$0'), 1, 1, '')
from
 #t;

rollback;

begin tran;

with x as
(
 select
  t.txt, b.txt_new
 from
  #t t cross apply
  (
   select
    string_agg(a.s, ',') within group (order by a.rn)
   from
    (
     select top (len(t.txt) - 1)
      row_number() over (order by 1/0) as rn,
      left(t.txt, 1) + substring(t.txt, row_number() over (order by 1/0) + 1, 1)
     from
      master.dbo.spt_values
    ) a(rn, s)
  ) b(txt_new)
)
update /*split and string_agg by invm*/ x
 set
  txt = txt_new
option
 (maxdop 1);

rollback;

begin tran;

with x as
(
 select
  t.txt, b.txt_new
 from
  #t t cross apply
  (
   select
    string_agg(a.s, ',') within group (order by a.rn)
   from
    (
     select top (len(t.txt) - 1)
      row_number() over (order by 1/0) as rn,
      left(t.txt, 1) + substring(t.txt, row_number() over (order by 1/0) + 1, 1)
     from
      master.dbo.spt_values
    ) a(rn, s)
  ) b(txt_new)
)
update /*split and string_agg by invm (optimization spool+sort off)*/ x
 set
  txt = txt_new
option
 (maxdop 1, queryruleoff BuildSpool);

rollback;

begin tran;

;with cte as (
	select
		t.id,
		t.txt,
		a.number,
		a.ch
	from #t t
	cross apply (select v.number, substring(t.txt, 1+v.number, 1) as ch from master..spt_values v 
                           where v.number < len(t.txt) and v.type = 'P') a
),
s as
(
 select
 	t1.id,
 	string_agg(t1.ch + t2.ch, ',') within group(order by t2.number) as xz
 from cte t1 inner join cte t2 on t1.id=t2.id 
 where t1.number = 0 and t2.number <> 0
 group by t1.id
)
update /*by court*/ t
 set
  txt = s.xz
from
 s join
 #t t on t.id = s.id;

rollback;

begin tran;

update /*scalar function by MaksK*/ #t set txt = dbo.Replacetxt(txt);

rollback;

with r as
(
 select
  a.descr
 from
  (
   values
    ('split and string_agg by invm'), ('by court'), ('RegexpReplace wrapper'), ('cycle by aleks222'), ('scalar function by MaksK'),
    ('split and string_agg by invm (optimization spool+sort off)')
  ) a(descr)
),
qs as
(
 select top (1) with ties
  r.descr, qs.execution_count, qs.total_worker_time, qs.total_elapsed_time, qs.creation_time,
  a.statement_text, cast(qp.query_plan as xml) as query_plan
 from
  sys.dm_exec_query_stats qs join
  sys.dm_exec_cached_plans cs on cs.plan_handle = qs.plan_handle cross apply
  sys.dm_exec_sql_text(qs.sql_handle) st cross apply
  sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) qp cross apply
  (
   select substring(st.text, (qs.statement_start_offset/2)+1,   
          ((case qs.statement_end_offset  
             when -1 then datalength(st.text)  
             else qs.statement_end_offset  
            end - qs.statement_start_offset)/2) + 1)
 ) a(statement_text) join
 r on a.statement_text like '%/*' + r.descr + '*/%'
 order by
  row_number() over (partition by r.descr order by qs.creation_time desc)
)
select
 *
from
 qs
order by
 total_elapsed_time
option
 (recompile);
go

drop function dbo.Replacetxt;
go


Без кластерного индекса
descrexecution_counttotal_worker_timetotal_elapsed_timesplit and string_agg by invm155707365574050split and string_agg by invm (optimization spool+sort off)160299076031316by court11072529110728791RegexpReplace wrapper11264266312759471scalar function by MaksK12042599620428520cycle by aleks222252653689226551510
С кластерным индексом
descrexecution_counttotal_worker_timetotal_elapsed_timesplit and string_agg by invm128853732886588split and string_agg by invm (optimization spool+sort off)136568943658163by court184948228508147RegexpReplace wrapper11057879710723925cycle by aleks222251095822610958685scalar function by MaksK11720619317207736
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076053
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то у тебя показания сильно гуляют? Не, есть, канешно, и стабильные герои.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076058
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

мой эксперимент показал, что при использовании CLR функции, которая содержит только RETURN input_paramert невозможно получить результат при вставке в новую таблицу лучше, чем 400 мсек в среднем. Т.е. это теоретический предел, который можно достигнуть специализированной функцией для разбора и формирования новой строки. Вашим же примером достигается результат 200мсек.

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

Если требуется "простота", то CLR функция - это компромисс по производительности.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076089
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222, Владислав Колосов

Это намеки на подтасовку?

Ну так скрипт и результаты опубликованы.
CLR-функция использовалась такая
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    private static readonly Dictionary<String, RegexOptions> OptionsDictionary = new Dictionary<String, RegexOptions>()
    {
        {"None", RegexOptions.None},
        {"IgnoreCase", RegexOptions.IgnoreCase},
        {"Multiline", RegexOptions.Multiline},
        {"CultureInvariant", RegexOptions.CultureInvariant},
        {"Compiled", RegexOptions.Compiled},
        {"ECMAScript", RegexOptions.ECMAScript},
        {"ExplicitCapture", RegexOptions.ExplicitCapture},
        {"IgnorePatternWhitespace", RegexOptions.IgnorePatternWhitespace},
        {"RightToLeft", RegexOptions.RightToLeft},
        {"Singleline", RegexOptions.Singleline}
    };

    private static RegexOptions ParseOptions(SqlString AOptionsString)
    {
        if (AOptionsString.IsNull)
            return DefaultOptions;
        
        RegexOptions AOptions = RegexOptions.None;
        RegexOptions x;

        String[] s = AOptionsString.Value.Split(new String[] {",", "|"}, StringSplitOptions.RemoveEmptyEntries);
        foreach (String o in s)
            if (OptionsDictionary.TryGetValue(o, out x))
                AOptions |= x;

        return AOptions;
    }

   [SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlString RegexpMatch(SqlString AText, SqlString APattern, SqlString AReplacementPattern, SqlString AOptions)
    {
        if (APattern.IsNull || AText.IsNull)
            return SqlString.Null;

        var m = Regex.Match(AText.Value, APattern.Value, ParseOptions(AOptions));
        return AReplacementPattern.IsNull ? m.Value : m.Result(AReplacementPattern.Value);
    }


Сервер
Код: sql
1.
2.
3.
4.
Microsoft SQL Server 2019 (RTM-CU10) (KB5001090) - 15.0.4123.1 (X64) 
	Mar 22 2021 18:10:24 
	Copyright (C) 2019 Microsoft Corporation
	Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19041: )



Так что теперь можете экспериментировать самостоятельно.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076098
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
aleks222, Владислав Колосов
Это намеки на подтасовку?
Так что теперь можете экспериментировать самостоятельно.



Не, дарагой, мне лень.
Я и без твоих изысков представляю недостатки и достоинства вариантов.
...
Рейтинг: 0 / 0
Замена символов в строке
    #40076104
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Я и без твоих изысков представляю недостатки и достоинства вариантов.
Ну тогда бы не предлагал кластерный индекс :)
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена символов в строке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]