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

Откуда:
Сообщений: 61
Добрый день! Необходимо распарсить строчку. Получил значения в виде таблицы, используя табличную фуункцию.

select  * 		
   		from dbo.IMG_Parse_Values_String('2110=277559;2120=-240413;2100=37146;2210=0;2220=0;2200=37146;2310=0;2320=166;2330=-26455;2340=992;2350=-1304;2300=10545;2410=-3180;2421=0;2430=-1597;2450=544;2460=0;2400=6312;')


Результат выполнения:
2110	277559
2120	-240413
2100	37146
2210	0
2220	0
2200	37146
2310	0
2320	166
2330	-26455
2340	992
2350	-1304
2300	10545
2410	-3180
2421	0
2430	-1597
2450	544
2460	0
2400	6312


Мне необходимо получить данные в одну строчку. Где наименование колонки будет названием параметра, а значением, соответственно значение.


Смысл такой, что есть набор данных:

6318201091	2110=194;2120=0;2100=194;2210=0;2220=-184;2200=10;2310=0;2320=0;2330=0;2340=348;2350=-358;2300=0;2410=0;2421=0;2430=0;2450=0;2460=0;2400=0;
7841320354	2110=992325;2120=-929092;2100=63233;2210=0;2220=-37199;2200=26034;2310=604;2320=15672;2330=-27011;2340=16465;2350=-14989;2300=16775;2410=0;2421=-1186;2430=-5048;2450=507;2460=-73;2400=12161;
6316137411	2110=12911;2120=-10108;2100=2803;2210=0;2220=-2668;2200=135;2310=0;2320=1;2330=-9;2340=114568;2350=-114614;2300=81;2410=-26;2421=0;2430=0;2450=0;2460=0;2400=55;
6315559594	2110=6591;2120=-8245;2100=-1654;2210=0;2220=0;2200=-1654;2310=0;2320=0;2330=0;2340=7100;2350=-52;2300=5394;2410=0;2421=0;2430=0;2450=0;2460=-442;2400=4952;


Надо, чтобы выводились названия по колонкам.

6318201091	194	0	194	0	-184	10	0	0	0	348	-358	0	0	0	0	0	0	0
7841320354	992325	-929092	63233	0	-37199	26034	604	15672	-27011	16465	-14989	16775	0	-1186	-5048	507	-73	12161
9 апр 15, 09:24    [17491966]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
Glory
Member

Откуда:
Сообщений: 104760
Создание набора с произвольным количеством столбцов - это не парсинг
9 апр 15, 09:33    [17492024]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
CheaterX
Member

Откуда:
Сообщений: 61
Число столбцов одинаковое. 18 значений. Наименование параметров тоже одинаковое.
9 апр 15, 09:55    [17492146]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
Glory
Member

Откуда:
Сообщений: 104760
CheaterX
Число столбцов одинаковое. 18 значений. Наименование параметров тоже одинаковое.

Тогда PIVOT вам поможет
9 апр 15, 09:57    [17492162]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @temp TABLE
(
	ID BIGINT PRIMARY KEY,
	Value VARCHAR(MAX)
)

INSERT INTO @temp (ID, Value)
VALUES
	(6318201091, '2110=194;2120=0;2100=194;2210=0;2220=-184;2200=10;2310=0;2320=0;2330=0;2340=348;2350=-358;2300=0;2410=0;2421=0;2430=0;2450=0;2460=0;2400=0;'),
	(7841320354, '2110=992325;2120=-929092;2100=63233;2210=0;2220=-37199;2200=26034;2310=604;2320=15672;2330=-27011;2340=16465;2350=-14989;2300=16775;2410=0;2421=-1186;2430=-5048;2450=507;2460=-73;2400=12161;'),
	(6316137411, '2110=12911;2120=-10108;2100=2803;2210=0;2220=-2668;2200=135;2310=0;2320=1;2330=-9;2340=114568;2350=-114614;2300=81;2410=-26;2421=0;2430=0;2450=0;2460=0;2400=55;'),
	(6315559594, '2110=6591;2120=-8245;2100=-1654;2210=0;2220=0;2200=-1654;2310=0;2320=0;2330=0;2340=7100;2350=-52;2300=5394;2410=0;2421=0;2430=0;2450=0;2460=-442;2400=4952;')

SELECT *
FROM (
	SELECT t.ID, Col = PARSENAME(t.Value, 2), Val = PARSENAME(t.Value, 1)
	FROM (
		SELECT t.ID, Value = REPLACE(t2.c2.value('.', 'VARCHAR(100)'), '=', '.')
		FROM (
			SELECT ID, Value = CAST('<r><s>' + REPLACE(Value, ';', '</s><s>') + '</s></r>' AS XML)
			FROM @temp
		) t
		CROSS APPLY t.Value.nodes('r/*') t2(c2)
	) t
) t
PIVOT (
	MAX(Val)
	FOR Col IN (
		[2100],[2110],
		[2120],[2200],[2210],[2220],
		[2300],[2310],[2320],[2330],
		[2340],[2350],[2400],[2410],
		[2421],[2430],[2450],[2460]
	) 
) p
9 апр 15, 11:21    [17492668]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
еще вариант...
Guest
declare @t table (idx bigint, s varchar(max))
insert @t(idx,s) values	(6318201091, '2110=194;2120=0;2100=194;2210=0;2220=-184;2200=10;2310=0;2320=0;2330=0;2340=348;2350=-358;2300=0;2410=0;2421=0;2430=0;2450=0;2460=0;2400=0;'),
  (7841320354, '2110=992325;2120=-929092;2100=63233;2210=0;2220=-37199;2200=26034;2310=604;2320=15672;2330=-27011;2340=16465;2350=-14989;2300=16775;2410=0;2421=-1186;2430=-5048;2450=507;2460=-73;2400=12161;'),
  (6316137411, '2110=12911;2120=-10108;2100=2803;2210=0;2220=-2668;2200=135;2310=0;2320=1;2330=-9;2340=114568;2350=-114614;2300=81;2410=-26;2421=0;2430=0;2450=0;2460=0;2400=55;'),
  (6315559594, '2110=6591;2120=-8245;2100=-1654;2210=0;2220=0;2200=-1654;2310=0;2320=0;2330=0;2340=7100;2350=-52;2300=5394;2410=0;2421=0;2430=0;2450=0;2460=-442;2400=4952;')

declare @s varchar(max)

;with t0 as (
  select idx, cast('<b>'+replace(substring(s,1,len(s)-1),';','</b><b>')+'</b>' as xml) xm from @t
), t1 as (
  select idx, x.z.value('.', 'varchar(max)')[st]
  from t0 outer apply xm.nodes('b') x(z)
), t2 as (
  select idx, stuff(st,1,charindex('=',st),'') [st] from t1
)
select @s = 
(select distinct 'select ' + cast(idx as varchar(25)) +', '+ stuff((select ',' + st from t2 b where b.idx = t2.idx for xml path('')),1,1,'') + ' union all' + char(10)
from t2 for xml path(''));

select @s = substring(@s, 1, len(@s)-10)
exec(@s)
9 апр 15, 11:37    [17492776]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
CheaterX
Member

Откуда:
Сообщений: 61
Спасибо огромное! 1 запрос отлично сработал.
9 апр 15, 13:26    [17493515]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки/Табличная функция  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Рад был помочь. Хорошего дня.
9 апр 15, 13:42    [17493661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить