Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Запрос с большим количеством Replace  [new]
temoxa
Member

Откуда:
Сообщений: 405
Всем привет! Есть такая проблема - запрос который содержит в себе порядка 15 реплейсов для одного столбца, есть ли какие варианты отойти/модифицировать эту кучу реплейсов, можно ли это красиво разрулить на SSIS? Cпасибо!
24 июн 15, 13:57    [17811234]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Добрый Э - Эх
Guest
temoxa,

ты даже "фотографии" этих множественных реплейсов не выложил. как же нам диагноз-то ставить?
24 июн 15, 14:07    [17811292]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
5541351
24 июн 15, 14:07    [17811296]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
temoxa
Member

Откуда:
Сообщений: 405
Пардон, вот примерчик

SELECT  F_C_DATA_GR.NDF_CODE, 
	(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
	replace(replace(replace(replace(replace(replace(f_c_data_gr.NAME + ISNULL(f_c_data_gr.FORM, '') + ISNULL(f_c_data_gr.MANUFACTURER, '') + CAST(F_C_DATA_GR.PRICE AS varchar(15))
, '.', ''), ',', ''), '_', ''), '  ', ''), ' ', ''), '|', ''), '№', 'N'), '-', ''), 'і', 'и'), '/', ''), '##', ''), '#', ''), '(', ''), ')', ''), '"', ''), '@', '')
, '$', ''), '**', ''), '%', ''), '+', ''), '*', ''), '=', ''), '~', '')) n
 FROM          F_C_DATA_GR
24 июн 15, 14:36    [17811494]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7967
temoxa, 15 это ерунда.
24 июн 15, 14:53    [17811614]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Dmitri4
Member

Откуда: Москва
Сообщений: 123
На T-SQL один из вариантов - использовать функцию

create function [dbo].[Split](@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end


Пример её использования:

DECLARE @NEWSTRING VARCHAR(100) 
SET @NEWSTRING = '(N_100-(6858)*(6858)*N_100/0_2)%N_35' ;
SELECT @NEWSTRING = REPLACE(@NEWSTRING, items, '~') FROM dbo.Split('+,-,*,/,%,(,)', ',');
PRINT @NEWSTRING


Ну и результат:

~N_100~~6858~~~6858~~N_100~0_2~~N_35



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

CREATE FUNCTION fwt_StringReduce
      (
      @inputstr VARCHAR(4096)
      , @stripchrs VARCHAR(255)
      )
RETURNS VARCHAR(4096)
AS  
BEGIN 
      DECLARE @charcounter INT
      SET @charcounter = 1
      WHILE  @charcounter <= LEN(@stripchrs)
      BEGIN
            SET @inputstr = REPLACE(@inputstr, SUBSTRING(@stripchrs, @charcounter, 1), '')
            SET @charcounter = @charcounter + 1
      END
RETURN @inputstr
END


Пример использования:

SELECT dbo.fwt_StringReduce(name, '@#$^&*()-+_') FROM test 



С обработкой этого только на стороне SSIS не подскажу.
24 июн 15, 18:57    [17812694]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5994
Dmitri4
На T-SQL один из вариантов - использовать функцию

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

temoxa, это можно красиво оформить елочкой, чтобы не путаться в уровнях вложенности. По быстродействию вариант с вложенными replace - самый оптимальный.
24 июн 15, 19:30    [17812779]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
temoxa,

1. 17308762

2. таблица замен+рекурсия
declare @t table(id int identity, txt varchar(100))
declare @for_replace table(ch_in varchar(2), ch_out varchar)

insert into @t (txt)

select 'aa%aa№ac№№cc==t=tw|er|twertt' union all
select 'g%g%gegg|||wq№wj=jg==jfsgft|de||zacx'

insert into @for_replace(ch_in, ch_out)

select '=', '' union all
select '%', '' union all
select '№', 'N' union all
select '|', '' 

;with cte1 as 
	(select *, row_number() over(order by(select null)) as rn from @for_replace),
cte2 as 
	(
	select id, replace(txt, ch_in, ch_out) as txt, 1 as l 
	from @t cross join cte1 where cte1.rn=1 

	union all

	select id, replace(txt, ch_in, ch_out) as txt, l+1 as l
	from cte2 cross join cte1 where cte1.rn=l+1 
	)

select top 1 with ties
	id,
	txt
from cte2
order by row_number() over(partition by id order by l desc)

id          txt
----------- --------------------------------------------
1 aaaaNacNNccttwertwertt
2 gggeggwqNwjjgjfsgftdezacx
24 июн 15, 19:35    [17812791]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
temoxa
replace(... '  ', ''), ' ', ''), ... '##', ''), '#', '')..., '**', '')..., '*', '') ...

25 июн 15, 00:08    [17813378]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
temoxa
можно ли это красиво разрулить на SSIS? Cпасибо!


На SSIS делайте DataFlow и Source -> Script -> Destination и в скрипте на C# творите, что хотите. Регулярные выражения, циклы по массиву и т.д.

Здесь распиcано хорошо
http://www.purplefrogsystems.com/blog/2011/07/pattern-matching-in-ssis-using-regular-expressions-and-the-script-component/
25 июн 15, 10:06    [17814079]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
ЦБ
temoxa,

1. 17308762

2. таблица замен+рекурсия
declare @t table(id int identity, txt varchar(100))
declare @for_replace table(ch_in varchar(2), ch_out varchar)

insert into @t (txt)

select 'aa%aa№ac№№cc==t=tw|er|twertt' union all
select 'g%g%gegg|||wq№wj=jg==jfsgft|de||zacx'

insert into @for_replace(ch_in, ch_out)

select '=', '' union all
select '%', '' union all
select '№', 'N' union all
select '|', '' 

;with cte1 as 
	(select *, row_number() over(order by(select null)) as rn from @for_replace),
cte2 as 
	(
	select id, replace(txt, ch_in, ch_out) as txt, 1 as l 
	from @t cross join cte1 where cte1.rn=1 

	union all

	select id, replace(txt, ch_in, ch_out) as txt, l+1 as l
	from cte2 cross join cte1 where cte1.rn=l+1 
	)

select top 1 with ties
	id,
	txt
from cte2
order by row_number() over(partition by id order by l desc)

id          txt
----------- --------------------------------------------
1 aaaaNacNNccttwertwertt
2 gggeggwqNwjjgjfsgftdezacx



Насколько тут многие ненавидят SSIS, что будут извращаться с мегаскриптами до посинения. А вопрос между тем был "можно ли это красиво разрулить на SSIS?"
25 июн 15, 10:09    [17814092]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
a_voronin
Насколько тут многие ненавидят SSIS, что будут извращаться с мегаскриптами до посинения. А вопрос между тем был "можно ли это красиво разрулить на SSIS?"
Ну и где в твоём
a_voronin
На SSIS делайте DataFlow и Source -> Script -> Destination и в скрипте на C# творите, что хотите. Регулярные выражения, циклы по массиву и т.д.

красота ?

Перенести replace-ы из запроса в скрипт C# ? Это "красота" ? :)
Добавить новую замену - лезь в скрипт, добавляй и пересобирай пакет ! Чертовски "удобно и кросссиво"
25 июн 15, 10:17    [17814116]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
[quot ЦБ]
a_voronin
Добавить новую замену - лезь в скрипт, добавляй и пересобирай пакет ! Чертовски "удобно и кросссиво"


Если вы чуть подумает , то положите их в таблицу, прочитаете её в dataset и будете ходить по нему в цикле.

А вот в том, что очисткой строк не надо заниматься на уровне SQL Server я уверен на 100 %.

Я скажу больше под SSIS это будет работать быстрее.
25 июн 15, 10:28    [17814169]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31488
a_voronin
будут извращаться с мегаскриптами до посинения. А вопрос между тем был "можно ли это красиво разрулить на SSIS?"
Только как вызвать этот SSIS пакет из запроса? Вопрос то между тем был "...запрос который содержит в себе...".
Если речь о преобразованиях данных при импорте, то почему бы и не SSIS? (Хотя если SSIS будет использоваться только для реализации REPLACE, то я бы его не использовал - только как комплексное решение для импорта).
a_voronin
Насколько тут многие ненавидят SSIS
Да любим мы SSIS, и очень много где используем.
Но используем для того, для чего он предназначен - для импорта данных.

Мы просто реалисты, и опытные люди, мы понимаем, насколько увеличивается количество служебок, совещаний, и как трудно оправдываться перед топ-менеджерами, если начинаешь использовать SSIS, сколько вдруг появляется геморроя.

Потому что в пару раз вырастает количество сущностей в системе, внешних, "интерфейсных" для сторонних партнёров. Допустим, по административной цепочке, в подразделения, подчинающееся другим замдиректорам, нужно передавать не только T-SQL скрипты с инструкциями, но и SSIS-пакеты, а к ним инструкции, совсем другие, с инсталяторами, сложными настройками секюрити и т.д.
25 июн 15, 10:56    [17814327]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5994
a_voronin
Я скажу больше под SSIS это будет работать быстрее.

Это предложение поверить на слово?
И да, быстрее, чем что?
25 июн 15, 11:54    [17814698]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
Сон Веры Павловны
a_voronin
Я скажу больше под SSIS это будет работать быстрее.

Это предложение поверить на слово?
И да, быстрее, чем что?


Вы хотите мне сказать, что REPLACE на уровне SQL Server-a работает быстро. Я даже пытаться доказывать не буду. Мне очевидно. что строковые операции в C# на порядок быстрее. Если вам не очевидно, эксперементируйте.
25 июн 15, 11:58    [17814720]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
a_voronin
Мне очевидно. что строковые операции в C# на порядок быстрее. Если вам не очевидно, эксперементируйте.

только вот t-sql replace применяеться к набору данных..в отличие от C# кода
А так чисто сферически - понятно ,что скорее всего быстрее ,только кого ето спасет в данной ситуевина когда на вхоже массив из 100к записей
25 июн 15, 12:07    [17814781]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Maxx
А так чисто сферически - понятно ,что скорее всего быстрее
А, собственно говоря, почему?
Точно такая же библиотечная функция.
Лежит себе, небось, в скомпилированном виде, линкуется в месте вызова.
25 июн 15, 12:11    [17814796]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
А, собственно говоря, почему?

я ж написал чисто сферически,не более
25 июн 15, 12:16    [17814817]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
Maxx
только вот t-sql replace применяеться к набору данных..в отличие от C# кода


А что такое "к набору данных"? Вы хотите мне сказать, что там записи не обрабатываются индивидуально и эта индивидуальное обращение к записям будет быстрее чем в цикл по массиву в коде.

Можно придумать гипотетическую ситуацию, где у нас много повторяющихся строк и они покрыты индексом и одинаковые строки будут обработаны один раз. Но если мы просто перебираем строки в лоб, то код языка программирования в отличие от скрипта БД будет быстрее.

Для справки -- в SSIS поток буферизован, строки буфера перебираются циклом, некий код применяется к каждой строке. Никакой перекомпиляции на лету. Откопилировался при старте и вперед.

Вот вам код: 2 лимона регулярных выражений за 7.5 секунд
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var s = @"Красная футболка адиддас";
            var s1 = @"совсем Красная футболка ";

            int UPPER = 1000000;
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Regex r = new Regex("((ади.*)(Кра))|((Кра.*)(ади))");
            for (int i = 0; i < UPPER; i++)
            {
                var x = r.IsMatch(s);
                var x2 = r.IsMatch(s1);
            }
            sw.Stop();
            Debug.WriteLine(sw.Elapsed);
        }
    }
}


результат
00:00:07.4231969

А теперь повторите это на LIKE-ками - а я посмеюсь
25 июн 15, 12:42    [17814979]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
А теперь повторите это на LIKE-ками - а я посмеюсь

Т.е. мне из клиентской программы вместо запроса запускать теперь ваш чудо SSIS ?
И где ждать результата ?
Только мне не 2 миллиона нужно, а из 2х миллионов выбрать 10 строк
25 июн 15, 12:59    [17815073]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
Glory
a_voronin
А теперь повторите это на LIKE-ками - а я посмеюсь

Т.е. мне из клиентской программы вместо запроса запускать теперь ваш чудо SSIS ?
И где ждать результата ?
Только мне не 2 миллиона нужно, а из 2х миллионов выбрать 10 строк


Опять всё с ног на голову. Прочитать ваши 10- строк в клиентскую программу и там обработать. А не заниматься извращениями на стороне SQL Server
25 июн 15, 13:05    [17815107]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Glory
Member

Откуда:
Сообщений: 104760
a_voronin
Опять всё с ног на голову. Прочитать ваши 10- строк в клиентскую программу и там обработать. А не заниматься извращениями на стороне SQL Server

Разумеется. Это же ваша визитная каторчка - прийти в любую чужую тему и начать там решать свою задачу. И доказывать что ваше решение самое лучшее.
Так что поумерьте свой бла-бла-бла
25 июн 15, 13:07    [17815128]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
a_voronin
Вот вам код: 2 лимона регулярных выражений за 7.5 секунд

ето просто 1 лям операция на 2мя строками не более
К теме обсуждения не лепиться вообще кстате...и даже не показывает как оно быстрее replace
25 июн 15, 13:23    [17815230]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с большим количеством Replace  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
a_voronin
Maxx
только вот t-sql replace применяеться к набору данных..в отличие от C# кода


А что такое "к набору данных"? Вы хотите мне сказать, что там записи не обрабатываются индивидуально и эта индивидуальное обращение к записям будет быстрее чем в цикл по массиву в коде.

Можно придумать гипотетическую ситуацию, где у нас много повторяющихся строк и они покрыты индексом и одинаковые строки будут обработаны один раз. Но если мы просто перебираем строки в лоб, то код языка программирования в отличие от скрипта БД будет быстрее.

Для справки -- в SSIS поток буферизован, строки буфера перебираются циклом, некий код применяется к каждой строке. Никакой перекомпиляции на лету. Откопилировался при старте и вперед.

Вот вам код: 2 лимона регулярных выражений за 7.5 секунд
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var s = @"Красная футболка адиддас";
            var s1 = @"совсем Красная футболка ";

            int UPPER = 1000000;
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Regex r = new Regex("((ади.*)(Кра))|((Кра.*)(ади))");
            for (int i = 0; i < UPPER; i++)
            {
                var x = r.IsMatch(s);
                var x2 = r.IsMatch(s1);
            }
            sw.Stop();
            Debug.WriteLine(sw.Elapsed);
        }
    }
}


результат
00:00:07.4231969

А теперь повторите это на LIKE-ками - а я посмеюсь


К сообщению приложен файл. Размер - 21Kb
25 июн 15, 13:30    [17815272]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить