Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 функция замены подстрок из таблицы  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Есть таблица, в которой хранятся пары значений - что на что заменить.
Пытаюсь создать строковую ФУНКЦИЮ, которая будет преобразовывать строку на входе, применяя к ней все правила, в выходную строку. Помогите со скриптом плиз.
9 июн 21, 11:05    [22333174]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
только курсор?
9 июн 21, 11:08    [22333175]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9772
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.Replacements (s varchar(100), s_replacement varchar(100));
insert into dbo.Replacements
values
 ('a', 'b'), ('c', 'd');
go

create function dbo.fnBatchReplace
(
 @s varchar(max)
)
returns varchar(max)
as
begin
 with r as
 (
  select top (cast(0x7fffffff as int))
   s, s_replacement
  from
   dbo.Replacements
  order by
   len(s) desc
 )
 select @s = replace(@s, s, s_replacement) from r;

 return @s;
end;
go

declare @s varchar(max) = 'acac';
select @s, dbo.fnBatchReplace(@s);
go

drop function dbo.fnBatchReplace;
drop table dbo.Replacements;
go
9 июн 21, 11:47    [22333196]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8690
=Сергей=,

если без заморочек, то создайте CLR функцию на C#.

Текст на текст можно заменить при помощи patindex() + stuff().
9 июн 21, 12:16    [22333216]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Кесарь
Member

Откуда:
Сообщений: 651
Владислав Колосов,

вы всем так советуете эти функции... "В любой непонятной ситуации используйте CLR!"

Зачем здесь КЛР, если в задаче даже уже есть таблица?!!!


P.S. Особенно забавно в этой связи это ваше "без заморочек".

Сообщение было отредактировано: 9 июн 21, 12:12
9 июн 21, 12:20    [22333220]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8690
Кесарь,

Неожиданный вывод :) Вы хотя бы следите за контекстом задачи, для который я даю такую рекомендацию. Неизвестный шаблон, неизвестный результат... Лучше всего работать со сложными решения для строк на C#, в этом языке достаточно развитые инструменты обработки строк.
9 июн 21, 12:49    [22333242]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4447
invm
select top (cast(0x7fffffff as int))

А чем
select top 100 percent 

не устраивает?
Зачем такие сложные заморочки?

Сообщение было отредактировано: 9 июн 21, 12:53
9 июн 21, 13:01    [22333245]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Кесарь
Member

Откуда:
Сообщений: 651
Владислав Колосов
Кесарь,

Неожиданный вывод :) Вы хотя бы следите за контекстом задачи, для который я даю такую рекомендацию. Неизвестный шаблон, неизвестный результат... Лучше всего работать со сложными решения для строк на C#, в этом языке достаточно развитые инструменты обработки строк.


В контексте задачи ничего не сказано, что сервер должен обработать ВНЕШНЕЕ входное значение. Логично предположить, что оное значение тоже получено для входа в функцию из какой-то таблицы.

Исходя из этого непонятно, зачем выходить вовне и потом возвращаться обратно внутрь.
9 июн 21, 13:08    [22333250]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9772
SQL2008
Зачем такие сложные заморочки?
Затем, что top (100) percent исключит из плана сортировку, а она нужна.
9 июн 21, 13:14    [22333256]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21178
=Сергей=
только курсор?
Ну почему... можно и в рекурсивном CTE это сделать.

Не, бред, конечно, но ведь можно же! и даже можно сразу всю выборку прогнать через такую замену. Ресурсов, правда, она наест не по-детски...
9 июн 21, 13:21    [22333267]     Ответить | Цитировать Сообщить модератору
 Re: функция замены подстрок из таблицы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21178
Вот:
WITH
cte AS ( 
    SELECT id, value, 1 idx, value newvalue
    FROM data
    UNION ALL
    SELECT cte.id, 
           cte.value,
           cte.idx+1, 
           REPLACE(cte.newvalue, replacement.pattern, replacement.replacement)
    FROM cte
    JOIN replacement ON cte.idx = replacement.id )
SELECT id, value, newvalue
FROM cte 
WHERE idx = ( SELECT 1 + COUNT(*)
              FROM replacement )
ORDER BY id

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=6c0258e164b14c134d136954ab447914
9 июн 21, 13:38    [22333280]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить