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

Откуда:
Сообщений: 378
Доброго времени суток! Помогите пожалуйста строку вида
02000*a5-89501-019-9*c128-00; 200-00

преобразовать к виду:
02000*a 5-89501-019-9
02000*c 128-00; 200-00
25 янв 12, 11:50    [11966418]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
icprog
Member

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

Так ,вроде, работает:

declare @str varchar(1024)
set @str='02000*a5-89501-019-9*c128-00; 200-00'
select @str='select '''+replace(@str, '*', ''' as val union all select ''')+''''
declare @t table(id int identity, val varchar(100))
insert into @t
exec (@str)
select t1.val+' '+t2.val from @t t1, @t t2 where t1.id=1 and t1.id<t2.id
25 янв 12, 12:50    [11967012]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
icprog
Member

Откуда:
Сообщений: 166
А вообще, воспользуйтесь поиском, подобных тем много было, разница только в разделителях
25 янв 12, 12:53    [11967053]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
nickolay_fff,
типа такого можно придумать
declare @t table(id int identity, a varchar(100));
insert into @t(a) values ('02000*a5-89501-019-9*c128-00; 200-00');

with parsed
as
(
select 
	*,
	s1 = charindex('*',a),
	s2 = charindex('*',a,charindex('*',a)+1),
	l = len(a)
from @t
),
t as
(
select 
	*,
	part1 = substring(a,1,s1-1),
	part2 = substring(a,s1+1,s2-s1-1),
	part3 = substring(a,s2+1,l-s2)
from parsed
)
select part1+'*'+part2 as val from t
union all
select part1+'*'+part3 as val from t
25 янв 12, 13:06    [11967167]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
user89
Member

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

declare @s varchar(500)

set @s = '02000*a5-89501-019-9*c128-00; 200-00'

;with str_nums (n1, n2, Number) 
as
( 
 select 0 [n1], charindex('*', @s+'*') [n2], 0 as Number  
 union all
 select n2 [n1], charindex('*', @s+'*', n2+1) [n2], Number+1 [Number]
 from str_nums
 where n2 < len(@s)
) 
select left(@s, charindex('*', @s+'*')) + substring(@s, n1+1, n2-n1-1) [Value]
from str_nums
where Number > 0
25 янв 12, 13:10    [11967217]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Спасибо всем за помощь!
25 янв 12, 17:55    [11970571]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Господа, а как правильно расставить апострофы, чтобы заработало:
Set @FFF=N'select t1.val+' '+t2.val from @t t1, @t t2 where t1.id=1 and t1.id<t2.id'
exec sp_executesql @FFF ?
26 янв 12, 07:01    [11973179]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
nickolay_fff,

PRINT @FFF
26 янв 12, 09:33    [11973360]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
PRINT:
select  t1.val +' '+ t2.val from  @t t1,  @t t2 where t1.id=1 and t1.id<t2.id
Сообщение 1087, уровень 15, состояние 2, строка 1
Необходимо объявить табличную переменную "@t".
Хотя она объявлена ранее.
26 янв 12, 10:36    [11973681]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
kDnZP,
боюсь PRINT тут не поможет, ошибка будет еще на попытке распарсить код.

nickolay_fff,
Вы чего сделать-то хотите? Каждый строковой литерал должен быть заключен в кавычки, в данном случае одинарные, если кавычки встречаются в самой строке, то чтобы они не воспринимались парсером как спец.символ, нужно их задвоить, т.е. вместо ' поставить ''.
26 янв 12, 10:38    [11973696]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Хочу залить результат в табличную переменную в итоге
26 янв 12, 10:43    [11973732]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
nickolay_fff
Хочу залить результат в табличную переменную в итоге

Используй временную таблицу
declare @str varchar(1024)
set @str='02000*a5-89501-019-9*c128-00; 200-00'
select @str='select '''+replace(@str, '*', ''' as val union all select ''')+''''
create table #t (id int identity, val varchar(100))
insert into #t
exec (@str)
--select t1.val+' '+t2.val from @t t1, @t t2 where t1.id=1 and t1.id<t2.id

declare @FFF nvarchar(max)
Set @FFF=N'select t1.val+'' ''+t2.val from #t t1, #t t2 where t1.id=1 and t1.id<t2.id'
exec sp_executesql @FFF 
26 янв 12, 10:52    [11973806]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
nickolay_fff,

Ничего у вас не выйдет ибо
BOL
Переменная table ведет себя как локальная переменная. Она имеет точно определенную область применения. Это функция, хранимая процедура или пакет, в котором она объявлена.

table (Transact-SQL)
Вместо этого, заюзайте временную таблицу
-- не прокатит
declare @t table(a int);
exec ('insert into @t(a) values(1)');

-- прокатит
create table #t (a int);
exec ('insert into #t(a) values(1)');
select * from #t;
drop table #t;
26 янв 12, 10:57    [11973831]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Спасибо :) Теперь работает.
26 янв 12, 10:59    [11973844]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
pooleet
Member

Откуда:
Сообщений: 45
denis2710
Используй временную таблицу
declare @str varchar(1024)
set @str='02000*a5-89501-019-9*c128-00; 200-00'
select @str='select '''+replace(@str, '*', ''' as val union all select ''')+''''
create table #t (id int identity, val varchar(100))
insert into #t
exec (@str)
--select t1.val+' '+t2.val from @t t1, @t t2 where t1.id=1 and t1.id<t2.id


как сделать так что бы можно было парсить строку до 10 значений?
29 мар 12, 16:09    [12334730]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
pooleet,
Устроит?
+

declare @str varchar(max)
, @delim char(1) = '*' ;
set @str = '02000*a5-89501-019-9*c128-00; 200-00*02001*a5-89501-019-9*c128-00; 200-00*02002*a5-89501-019-9*c128-00; 200-00*02003*a5-89501-019-9*128-00; 200-00*02004*a5-89501-019-9*c128-00; 200-00*02005*a5-89501-019-9*c128-00; 200-00*02006*a5-89501-019-9*c128-00; 200-00*02007*a5-89501-019-9*c128-00; 200-00*02008*a5-89501-019-9*c128-00; 200-00*02009*a5-89501-019-9*c128-00; 200-00'
declare @maxrow int = 12 ;

with  cte ( Word, String, Row )
        as ( select case when charindex(@delim, @str) = 0 then @str
                         else left(@str, charindex(@delim, @str) - 1)
                    end
                  , case when charindex(@delim, @str) = 0 then ''
                         else right(@str, len(@str) - charindex(@delim, @str))
                    end
                  , 1
             union all
             select case when charindex(@delim, cte.String) = 0 then cte.String
                         else left(cte.String, charindex(@delim, cte.String) - 1)
                    end
                  , case when charindex(@delim, cte.String) = 0 then ''
                         else right(cte.String, len(cte.String) - charindex(@delim, cte.String))
                    end
                  , cte.Row + 1
             from   cte
             where  len(cte.String) > 0
           )
  select  cte.Row
        , cte.Word
  from    cte
  where   cte.Row < @maxrow

29 мар 12, 17:10    [12335203]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
pooleet
Member

Откуда:
Сообщений: 45
denis2710,
у меня данные такого типа 11* 22* 33* ....
мне просто надо получить
11
22
33

я выделила фрагмент вашего запроса
select @str='select '''+replace(@str, '*', ''' as val union all select ''')+''''

потому что хотела понять какая зависимость в расположении ''' для другого количества входных данных (в моем случае до 10)


видимо мне тут придется искать ответ
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml#UNION
30 мар 12, 11:19    [12338786]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
pooleet,

10589208 + поиск
30 мар 12, 11:29    [12338875]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
pooleet,
Эти варианты работают независимо от количества параметров.
В вашем случае
+

declare @str varchar(max)
, @delim char(1) = '*' ;
set @str = '11*22*33*44*55*66*77*88*99*111' ;
with  cte ( Word, String, Row )
        as ( select case when charindex(@delim, @str) = 0 then @str
                         else left(@str, charindex(@delim, @str) - 1)
                    end
                  , case when charindex(@delim, @str) = 0 then ''
                         else right(@str, len(@str) - charindex(@delim, @str))
                    end
                  , 1
             union all
             select case when charindex(@delim, cte.String) = 0 then cte.String
                         else left(cte.String, charindex(@delim, cte.String) - 1)
                    end
                  , case when charindex(@delim, cte.String) = 0 then ''
                         else right(cte.String, len(cte.String) - charindex(@delim, cte.String))
                    end
                  , cte.Row + 1
             from   cte
             where  len(cte.String) > 0
           )
  select  cte.Row
        , cte.Word
  from    cte
  
select  @str = 'select ' + replace(@str, '*', ' as val union all select ') 
create table #t
  (
    id int identity
  , val varchar(100)
  )
insert  into #t
        exec ( @str
            )

declare @FFF nvarchar(max)
set @FFF = N'select * from #t t1'
exec sp_executesql 
  @FFF 

30 мар 12, 11:50    [12339025]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
А как можно наиболее оптимально по быстродействию организовать преобразование строки (во вложении)?

К сообщению приложен файл (Item.doc - 34Kb) cкачать
10 май 12, 13:48    [12529877]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
nickolay_fff, оптимальнее всего будет рассказать вашим постановщикам задач, о том что есть такая штука как XML. А заодно просветить о том, откуда должны расти руки.
10 май 12, 13:58    [12529946]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Для примера, дальше самостоятельно сделаете (см. во вложении, т.к. наличие спец. символов ломает сообщение)

К сообщению приложен файл (SQLQuery13.sql - 821bytes) cкачать
10 май 12, 14:19    [12530092]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP, блин. Попытка еще одна.

К сообщению приложен файл (SQLQuery13.sql - 1Kb) cкачать
10 май 12, 14:23    [12530132]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Благодарю. Сваял, даже стыдно показывать... :( Сильно не пинайте, просто наверняка можно все это сделать в несколько строк и грамотно.

К сообщению приложен файл (SQLQuery1.sql - 3Kb) cкачать
11 май 12, 13:56    [12536231]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
nickolay_fff, ну на всяк случай еще один вариант.

К сообщению приложен файл (Query.sql - 1Kb) cкачать
11 май 12, 14:34    [12536649]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить