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

Откуда:
Сообщений: 127
Добрый день.
Как из переменной
declare @sql varchar(max)=
'5A1	1
5A2	0.83
5A4	1.05
5A5	1.05
5A9	1.13
5AM	1
5C1	0.8
'

можно получить таблицу
col1col2
5A11
5A20.83
5A41.05
5A51.05
5A91.13
5AM1
5C10.8

?
20 июн 13, 16:51    [14461244]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
написать CLR
умело применять строковые функции
20 июн 13, 17:12    [14461357]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
писать в переменную @sql XML, а затем делать запрос используя методы типа данных XML
20 июн 13, 17:14    [14461374]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
nezhadnye_my
Guest
pio777,

а разделители всегда внутри пары #9,
а между парами #13#10?
20 июн 13, 17:15    [14461385]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
nezhadnye_my
Guest
короче, если разделители в точности как указано выше, то вот:
(можно собрать в 1 запрос, но лень.
вместо spt_values любая таблица чисел,
вместо char(3) любой символ, к-ый точно не встречается в строке)

declare @sql varchar(max)=
'5A1	1
5A2	0.83
5A4	1.05
5A5	1.05
5A9	1.13
5AM	1
5C1	0.8
'

declare @s varchar(max) = (select replace(@sql, char(13) + CHAR(10), char(3)));
declare @len  int = (select LEN(@s));
declare @ch table(n int, ch char(1));


with nums  as(
select number as n
from master..spt_values
where type = 'P' and number between 1 and @len
)

insert into @ch(n, ch)
select n, SUBSTRING(@s, n, 1)
from nums;

declare @coord table (n int, rn int);
insert into @coord (n, rn)
select n, ROW_NUMBER() over(order by n) 
from @ch
where ch = char(3);

declare @pairs table (n1 int, n2 int)
insert into @pairs (n1, n2)
select isnull(c2.n + 1, 1), c1.n - isnull(c2.n + 1, 1)
from @coord c1 left join @coord c2
       on c1.rn = c2.rn + 1;
       
declare @cnt int = (select count(*) from @pairs);       

with tmp as (      
select substring(@s, n1, n2) s
from @pairs ) 

select SUBSTRING(s, 1, charindex(char(9), s)) as col1,
       SUBSTRING(s, charindex(char(9), s), LEN(s)) as col2 
from tmp; 
20 июн 13, 18:13    [14461665]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
pio777
Member

Откуда:
Сообщений: 127
nezhadnye_my
pio777,

а разделители всегда внутри пары #9,
а между парами #13#10?


всегда
20 июн 13, 18:54    [14461821]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
pio777
всегда


Просто как вариант

declare @sql nvarchar(max)=
'5A1	1
5A2	0.83
5A4	1.05
5A5	1.05
5A9	1.13
5AM	1
5C1	0.8
'
set @sql = '(''' + replace(replace(@sql,char(9),''','),char(13)+char(10),'),(''')
set @sql = '
select *
from (
  values '+left(@sql,len(@sql)-3)+'
) degree (col1,col2)
'
exec sp_executesql @sql
20 июн 13, 19:42    [14461973]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
degree (col1,col2) ?
21 июн 13, 10:10    [14463692]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> degree (col1,col2) ?

BOL
<table_source> ::=
{...
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
21 июн 13, 10:38    [14463920]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
2008? В пятом не взлетает
21 июн 13, 10:56    [14464076]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> 2008? В пятом не взлетает

select from (values (), (), ...) стало можно только начиная с 2008.
а as table_alias (column_alias, ...) - это, если не всегда было можно, то уже очень давно. в 2000 точно.
21 июн 13, 11:01    [14464112]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
Cammomile,

Да, select * from (values ... ) началось в 2008. Автор про версию ничего не говорил, так что я как-бы волен в выборе ))
21 июн 13, 11:53    [14464592]     Ответить | Цитировать Сообщить модератору
 Re: Таблица из переменной  [new]
pio777
Member

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

Спасибо, хороший вариант.
21 июн 13, 18:01    [14467567]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить