Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Замена символов в строке / 25 сообщений из 33, страница 1 из 2
04.06.2021, 04:19
    #40075545
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
Добрый день,

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

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

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

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

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

если это надо делать постоянно, не храните данные так, используйте триггер или парсите это в приложении перед вставкой
...
Рейтинг: 0 / 0
04.06.2021, 07:17
    #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
04.06.2021, 07:27
    #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
04.06.2021, 08:18
    #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
04.06.2021, 14:51
    #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
04.06.2021, 15:54
    #40075714
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
Roust_m,

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

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

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


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

ЗЫ. Зря, что-ли, мелкософт не вводит в T-SQL такие "функции".
...
Рейтинг: 0 / 0
04.06.2021, 18:46
    #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
04.06.2021, 18:52
    #40075755
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
Если соревноваться "на скорость" - надо немного индексов дописать.
...
Рейтинг: 0 / 0
04.06.2021, 18:56
    #40075758
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
----
...
Рейтинг: 0 / 0
04.06.2021, 19:36
    #40075766
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
aleks222
Если соревноваться "на скорость" - надо немного индексов дописать.
Например?
...
Рейтинг: 0 / 0
04.06.2021, 21:32
    #40075785
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
aleks222,

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

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

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

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


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

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

Код: sql
1.
2.
declare @txt varchar(100) = '1ASDF';
select STUFF(dbo.RegexReplace(@txt, '.', ',' + left(@txt, 1) + '$0'), 1, 4, '');
...
Рейтинг: 0 / 0
07.06.2021, 12:01
    #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
07.06.2021, 12:10
    #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
07.06.2021, 12:16
    #40076053
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
Что-то у тебя показания сильно гуляют? Не, есть, канешно, и стабильные герои.
...
Рейтинг: 0 / 0
07.06.2021, 12:25
    #40076058
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
invm,

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

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

Если требуется "простота", то CLR функция - это компромисс по производительности.
...
Рейтинг: 0 / 0
07.06.2021, 13:21
    #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
07.06.2021, 13:28
    #40076098
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена символов в строке
invm
aleks222, Владислав Колосов
Это намеки на подтасовку?
Так что теперь можете экспериментировать самостоятельно.



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


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