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

Откуда: Украина, Винница
Сообщений: 277
Добрый день.

Есть хранимая процедура, на вход которой подаётся параметр типа
@@Id	= '.902.901.892.891.890.803.802.801.202.201.200.148.147.146.145.144.143.142.141.140.139.138.137.136.135.134.133.132.131.130.129.128.127.126.125.124.123.122.121.120.119.118.117.116.115.114.113.112.111.110.109.108.107.106.105.104.103.102.100.76.75.74.73.72.71.70.69.68.67.66.65.64.63.62.61.60.59.58.57.56.55.54.53.52.51.50.49.48.47.46.45.44.42.41.40.39.38.37.34.33.32.31.30.29.28.26.25.24.23.22.21.20.19.18.17.16.15.13.12.11.10.9.8.7.6.5.4.3.2.1'

При просмотре плана выполнения было замечено, что значительную часть времени сервер тратит на парсинг строки (а именно - на инсерт во временную таблицу значений 902,901...1).

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

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

Пока что пытаюсь реализовать через СТЕ. Может кто-то натолкнёт на мысль? Спасибо
4 янв 10, 17:09    [8146800]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Timid,

можно через тип данных xml , однако это не быстрый способ распарсивания. Лучшая схема - записать данные в таблицу и с ней джойнить. Вот такие пироги.
4 янв 10, 17:26    [8146876]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Ken@t
Timid,

можно через тип данных xml , однако это не быстрый способ распарсивания. Лучшая схема - записать данные в таблицу и с ней джойнить. Вот такие пироги.


Эгэ, только вот как раз на записи в таблицу время и теряется. Пытаюсь избавиться :)
4 янв 10, 17:30    [8146901]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timid


При просмотре плана выполнения было замечено, что значительную часть времени сервер тратит на парсинг строки (а именно - на инсерт во временную таблицу значений 902,901...1).

И кто писал функцию парсинга ?

Timid

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

https://www.sql.ru/forum/actualthread.aspx?tid=316343&pg=-1 - Ну так CTE. Только выигрыша во времени вы возможно и не получите
4 янв 10, 17:34    [8146916]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Timid
Ken@t
Timid,

можно через тип данных xml , однако это не быстрый способ распарсивания. Лучшая схема - записать данные в таблицу и с ней джойнить. Вот такие пироги.


Эгэ, только вот как раз на записи в таблицу время и теряется. Пытаюсь избавиться :)

И такое бывает, тогда через xml. Конечно значительно быстрее, чем распрасивать строки.
Может что-то не так в алгоритме записи в таблицу ?
4 янв 10, 18:01    [8146991]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Не думаю, что рекурсивное cte окажется быстрее xml парсинга.

Впрочем, сравнивайте сами:

declare @sid varchar(8000)
select @sid='.902.901.892.891.890.803.802.801.202.201.200.148.147.146.145.144.143.142.141.140.139.138.137.136.135.134.133.132.131.130.129.128.127.126.125.124.123.122.121.120.119.118.117.116.115.114.113.112.111.110.109.108.107.106.105.104.103.102.100.76.75.74.73.72.71.70.69.68.67.66.65.64.63.62.61.60.59.58.57.56.55.54.53.52.51.50.49.48.47.46.45.44.42.41.40.39.38.37.34.33.32.31.30.29.28.26.25.24.23.22.21.20.19.18.17.16.15.13.12.11.10.9.8.7.6.5.4.3.2.1'

declare @sx xml
select @sx = '<root><col>'+replace(substring(@sid,2,8000),'.','</col><col>')+'</col></root>'
select x.y.value('.', 'int')id
from @sx.nodes('/root/col') x(y)

;with q as (select cast(substring(@sid+'.',2,8000) as varchar(8000)) s, cast(null as int) id
union all
select cast(substring(s,pos+1,8000) as varchar(8000)), cast(left(s,pos-1) as int)
from q
cross apply (select charindex('.',s) pos)t
where pos>0
)  
select id from q
where id>0
option (maxrecursion 0)
4 янв 10, 18:09    [8147002]     Ответить | Цитировать Сообщить модератору
 Re: Снова строка в массив но с небольшим нюансом  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Anddros
Не думаю, что рекурсивное cte окажется быстрее xml парсинга.

Впрочем, сравнивайте сами:

declare @sid varchar(8000)
select @sid='.902.901.892.891.890.803.802.801.202.201.200.148.147.146.145.144.143.142.141.140.139.138.137.136.135.134.133.132.131.130.129.128.127.126.125.124.123.122.121.120.119.118.117.116.115.114.113.112.111.110.109.108.107.106.105.104.103.102.100.76.75.74.73.72.71.70.69.68.67.66.65.64.63.62.61.60.59.58.57.56.55.54.53.52.51.50.49.48.47.46.45.44.42.41.40.39.38.37.34.33.32.31.30.29.28.26.25.24.23.22.21.20.19.18.17.16.15.13.12.11.10.9.8.7.6.5.4.3.2.1'

declare @sx xml
select @sx = '<root><col>'+replace(substring(@sid,2,8000),'.','</col><col>')+'</col></root>'
select x.y.value('.', 'int')id
from @sx.nodes('/root/col') x(y)

;with q as (select cast(substring(@sid+'.',2,8000) as varchar(8000)) s, cast(null as int) id
union all
select cast(substring(s,pos+1,8000) as varchar(8000)), cast(left(s,pos-1) as int)
from q
cross apply (select charindex('.',s) pos)t
where pos>0
)  
select id from q
where id>0
option (maxrecursion 0)


Спасибо! То, что надо!
4 янв 10, 18:33    [8147055]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить