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

Откуда:
Сообщений: 639
Коллеги!
Нужна вумная мысль, как быстро и красиво преобразовать строки в таблицу.
итак в одной табличке есть поле с вот такими вот строками

'SFI_Bo_A\1078\1234\12345\56\'
'SFI\1079\134\145\44\'
'Bo_Area\1978\124\12345\44\'
'Area\1578\1234\145\24\'

мне надо получить из них таблицу вот такого вида

ItemName | Value01 | Value02 | Value03 | Value04 | 
--------------------------------------------------
SFI_Bo_A | 1078 | 1234 | 12345 | 56 |
... ... ... ... ... ... ... ... ...
Area | 1578 | 1234 | 145 | 24 |
14 янв 15, 15:55    [17117636]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
Владислав Колосов
Member

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

а почему Вы не хотите написать приложение для разбора этого? Не серверное дело разбирать строки, его дело - хранить и выдавать.
14 янв 15, 16:08    [17117757]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
Maxx
Member [скрыт]

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

1. Поиск по форуму
2. Даже в ФАКЕ по форуму ето есть
14 янв 15, 16:10    [17117783]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
RegisteredUser
Member

Откуда:
Сообщений: 639
Владислав Колосов,
ну, вот уже есть ХП которые колбасят данные из таблицы.
это поле только одна махонькая часть логики всех ХП.
кудаж мне шас встраивать в ХП еще и вызов внешней прикладухи?
14 янв 15, 16:11    [17117797]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Можно распарсить, например, функцией Функция, которая делит строку на слова,
а результат разобрать на колонки, например, с помощью MAX(CASE WHEN THEN ... END).
14 янв 15, 16:21    [17117924]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
А стандартные средства не подходят?
14 янв 15, 16:21    [17117930]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
В менеджмент студии тыркаете правым баттоном мауса в базу. -> Задачи -> Импорт данных...
Источник данных = Неструктурированный файл.
Дальше начинается магия.
14 янв 15, 16:29    [17117994]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Dmitry V. Liseev
В менеджмент студии тыркаете правым баттоном мауса в базу. -> Задачи -> Импорт данных...
Источник данных = Неструктурированный файл.
Дальше начинается магия.
Какой файл, если речь идёт про поле таблицы?
14 янв 15, 16:34    [17118027]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
with t0 as
(
	select 'SFI_Bo_A\1078\1234\12345\56\' as d union all
	select 'SFI\1079\134\145\44\' union all
	select 'Bo_Area\1978\124\12345\44\' union all
	select 'Area\1578\1234\145\24\' 
),
t1 as
(
	select d, match, [group], capture, value
	from
		t0
			cross apply
		ext.Regex_Matches(t0.d, '(.*?)\\(.*?)\\(.*?)\\(.*?)\\(.*?)\\', NULL)
)
select
	w.[2] as ItemName, w.[3] as Value01, w.[4] as Value02, w.[5] as Value03, w.[6] as Value04
from
	t1
		pivot
	(max(value) for [group] in ([2], [3], [4], [5], [6])) w;


ItemNameValue01Value02Value03Value04
Area1578123414524
Bo_Area19781241234544
SFI107913414544
SFI_Bo_A107812341234556
14 янв 15, 16:39    [17118066]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
обернул раз Regex.Matches, пользуюсь в таких затычках
14 янв 15, 16:42    [17118088]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Хз может надо кому. Обернул для себя, чтобы всякую мелочевку по быстрому делать. На PRODUCTION не использовать. Времени нету причесать и залить на какой нибудь github.

К сообщению приложен файл (RegexWrapper.cs - 6Kb) cкачать
14 янв 15, 16:51    [17118161]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
RegisteredUser
Member

Откуда:
Сообщений: 639
спасибо, что натолкнули на мыслю
НО хотелось бы сделать чистоганчиком получить счастья
НО что-то мешает )))

может подскажите где лоханулся?

dbo.SplitStrings ('.....') - функция которая раскладывает строку в строки

+ SplitStrings

FUNCTION [dbo].[SplitStrings]
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
E42(N) AS (SELECT 1 FROM E4 a, E2 b),
cteTally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1)))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42),
cteStart(N1) AS (SELECT t.N+1 FROM cteTally t
WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0))
SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000))
FROM cteStart s;


;with cte as (
	SELECT	row_number() over (order by tb.[rec]) [rec]
			, tb.Item [Item]
	FROM 
	(
		SELECT 1 as 'rec', Item
		FROM dbo.SplitStrings('SFI_Bo_A\1078\1234\12345\56\', '\')
		where len(rtrim(ltrim(Item))) > 0
	) as tb
 )


select
	w.[2] as ItemName, w.[3] as Value01, w.[4] as Value02, w.[5] as Value03, w.[6] as Value04
from
	(
		select ([rec] - 1) as 'rec', Item 
		from cte 
	) as t1
	pivot
	(
		max(rec) 
		for Item in ([2], [3], [4], [5], [6])
	) as w;


резалт не феншуйный


ItemName Value01 Value02 Value03 Value04
-------------------- -------------------- -------------------- -------------------- --------------------
NULL NULL NULL NULL NULL

(1 row(s) affected)

14 янв 15, 19:25    [17118966]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
declare @t table (s varchar(100));

insert into @t
values
('SFI_Bo_A\1078\1234\12345\56\'),
('SFI\1079\134\145\44\'),
('Bo_Area\1978\124\12345\44\'),
('Area\1578\1234\145\24\');

select
 a.x.value('v[1]', 'varchar(100)') as Value01,
 a.x.value('v[2]', 'varchar(100)') as Value02,
 a.x.value('v[3]', 'varchar(100)') as Value03,
 a.x.value('v[4]', 'varchar(100)') as Value04,
 a.x.value('v[5]', 'varchar(100)') as Value05
from
 @t t cross apply
 (select cast('<v>' + replace(t.s, '\', '</v><v>') + '</v>' as xml)) a(x);
14 янв 15, 19:51    [17119053]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Ну и до кучи:
select
 substring(t.s, 1, isnull(a1.p - 1, 2147483647)) as Value01,
 substring(t.s, a1.p + 1, a2.p - a1.p - 1) as Value02,
 substring(t.s, a2.p + 1, a3.p - a2.p - 1) as Value03,
 substring(t.s, a3.p + 1, a4.p - a3.p - 1) as Value04,
 substring(t.s, a4.p + 1, a5.p - a4.p - 1) as Value05
from
 @t t cross apply
 (select nullif(charindex('\', t.s, 1), 0)) a1(p) cross apply
 (select nullif(charindex('\', t.s, a1.p + 1), 0)) a2(p) cross apply
 (select nullif(charindex('\', t.s, a2.p + 1), 0)) a3(p) cross apply
 (select nullif(charindex('\', t.s, a3.p + 1), 0)) a4(p) cross apply
 (select isnull(nullif(charindex('\', t.s, a4.p + 1), 0), 2147483647)) a5(p);
14 янв 15, 20:35    [17119282]     Ответить | Цитировать Сообщить модератору
 Re: Строка в таблицу  [new]
RegisteredUser
Member

Откуда:
Сообщений: 639
сыпасыбо
15 янв 15, 14:43    [17122580]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить