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

Откуда: у парня сирийская грусть?
Сообщений: 748
Господа форумчане!

Подскажите, пожалуйста, можно ли в MSSQL так извратиться, чтобы загрузить csv-текст в таблицу из поля varbinary(max) или varchar(max) другой таблицы?

Если так нельзя, то можно ли так сделать через XML-поле таблицы и какой формат использовать для меньшего объёма.
28 май 12, 19:27    [12628070]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Larr`
Подскажите, пожалуйста, можно ли в MSSQL так извратиться, чтобы загрузить csv-текст в таблицу из поля varbinary(max) или varchar(max) другой таблицы?

Чем не устраивает стандартный INSERT... SELECT ?
28 май 12, 19:33    [12628089]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 748
В смысле стандартный? У меня в блобах одной таблицы как бы таблицы с тысячами строк внутри. Вот из этих какбыфайлов надо выковырять по разделителям данные и запихнуть в одну таблицу с десятком нормальных полей. Где тут стандартный инсерт-селект?
28 май 12, 19:42    [12628154]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Larr`
В смысле стандартный?

В прямом. Описанный в стандартах и хелпах

Larr`
У меня в блобах одной таблицы как бы таблицы с тысячами строк внутри. Вот из этих какбыфайлов надо выковырять по разделителям данные и запихнуть в одну таблицу с десятком нормальных полей

Нет такой команды "выковырять"
Если у вас данные находятся внутри поля, то придется писать свой парсер.

А проще выгрузить содержимое поля в файл. Который потом уже попробовать добавить командой BULK INSERT
28 май 12, 19:48    [12628180]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 748
Glory
Larr`
У меня в блобах одной таблицы как бы таблицы с тысячами строк внутри. Вот из этих какбыфайлов надо выковырять по разделителям данные и запихнуть в одну таблицу с десятком нормальных полей

Нет такой команды "выковырять"
Если у вас данные находятся внутри поля, то придется писать свой парсер.


Уважаемый Glory!
Вы так говорите, как будто это принципиально невозможно в SQL-сервере. Тем не менее, для столбцов xml такая операция не только возможна, но ещё и достаточно проста (и без написания своих парсеров). И прежде чем рассказывать, какие есть команды, можно было внимательней прочитать вопрос в начале топика и спуститься по ветке "если нет" и ответить на дополнительный вопрос (т.е как организовать XML, чтобы он был наименьшим по обьёму и похож на CSV).
28 май 12, 20:15    [12628313]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
Glory
Member

Откуда:
Сообщений: 104751
Larr`
Тем не менее, для столбцов xml такая операция не только возможна, но ещё и достаточно проста (и без написания своих парсеров).

Ну так что вы тогда тут про csv рассказываете ? Берите и используйте xml, если все так просто.

Larr`
И прежде чем рассказывать, какие есть команды, можно было внимательней прочитать вопрос в начале топика и спуститься по ветке "если нет" и ответить на дополнительный вопрос (т.е как организовать XML, чтобы он был наименьшим по обьёму и похож на CSV).

Даренному коню в зубы не смотрят.
Если не понимаете ответов, то я тут непричем
28 май 12, 20:23    [12628358]     Ответить | Цитировать Сообщить модератору
 Re: Импорт csv из blob-поля  [new]
user89
Member

Откуда:
Сообщений: 2083
Larr`,
тоже как-то столкнулся с ситуацией, когда в таблице было поле varchar(max). Там хранилась строка, разделитель запятая. Требовалось преобразовать с нормальный табличный вид для передачи в другую систему.
+ 2 варианта с замером на скорость. С рекурсией оказалось быстрее...
set nocount on
-- Заполним тестовые данные 8000 зап.
declare @t table (Account varchar(400), Industry varchar(400))
insert @t select 'aa', '<a1234567>, s2 & 222, s35, s4' union all select 'bb', 's12,' union all select 'cc', 't1' union all select 'dd', null

;with cte as (select *, 1 [cnt] from @t union all select Account, Industry, cnt+1 from cte where cnt < 2000) insert @t select Account +' '+ cast(cnt as varchar), Industry from cte option (maxrecursion 0)

set statistics time on
;with t1 as (select Account, a=Industry+',' from @t)
,t2 as
(
  select Account,cast(substring(a,t+1,8000)as varchar(8000))a,ltrim(cast(left(a,t-1)as varchar(8000)))st 
  ,1 [cnt]
  from t1 outer apply(select charindex(',',a)t)t
  union all
  select Account,cast(substring(a,t+1,8000)as varchar(8000)),ltrim(cast(left(a,t-1)as varchar(8000)))
  ,cnt+1
  from t2 cross apply(select charindex(',',a)t)t
  where t>0
)
select Account,st,cnt from t2
order by Account,st
option (maxrecursion 0)
set statistics time off

set statistics time on
;with cte as (
 select Account, cast('<r><c>'+replace(replace(replace(replace(Industry, '&', '||'), '<', '(('), '>', '))'),',','</c><c>')+'</c></r>' as xml) xm 
 from @t
 )
select Account, replace(replace(replace(rtrim(ltrim(x.z.value('.', 'varchar(4000)'))), '||','&'), '((','<'), '))','>') [Industry]
from cte outer apply xm.nodes('/r/c') x(z)
order by 1,2
set statistics time off
/*
 Время работы SQL Server:
   Время ЦП = 578 мс, затраченное время = 797 мс.

 Время работы SQL Server:
   Время ЦП = 2531 мс, затраченное время = 2848 мс.
*/
29 май 12, 11:30    [12630368]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить