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

Откуда:
Сообщений: 16
Всем привет. Не силён в SQL.
В общем задача такая, прога скидывает в базу строку данных, мне нужно разбить эту строку для записи по нескольким таблицам, для того что бы ID в этих таблицах были одни и те же, для дальнейшего вывода данных.

Помогите плиз в какую сторону копать.
22 май 09, 09:20    [7213476]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Oleg1313
Помогите плиз в какую сторону копать.


Для начала в сторону более детального описания строки, таблиц со структурой и алгоритма "распихивания". А с учетом этого,

автор
Не силён в SQL.


не совсем понятно, что Вы ждете от этих раскопок?!
22 май 09, 09:34    [7213532]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Oleg1313
Member

Откуда:
Сообщений: 16
есть строка вида - дата дата текст текст текст

Есть база с таблицами
ТабДата1, ТабДата2, ТабТекст1, ТабТекст2, ТабТекст3

Каждая таблица имеет такие поля как:

IDMess - айдишник сообщения (который должен одновременно автоинкрементироваться у нескольких таблиц при добавлении записи)
DATA - сами даннные.

В общем должно быть что-то в виде EXECUTE MYPROCEDURE дата дата текст текст текст
22 май 09, 09:53    [7213628]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Oleg1313
Member

Откуда:
Сообщений: 16
автор
не совсем понятно, что Вы ждете от этих раскопок?!


Опыта и знаний, т.к. мне больше не у кого узнать.
22 май 09, 09:54    [7213632]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Oleg1313,

Будет очень очень сложно добиться "одновременно автоинкрементироваться у нескольких таблиц"

Сделайте еще одну вспомогательную таблицу (например, MainTable). И в неё вставляете свою "есть строка вида - дата дата текст текст текст"

А на MainTable повесте тригер, который будет брать ID вставляемой запись, парсить входящую строку и раскидывать данные по таблицам "ТабДата1, ТабДата2, ТабТекст1, ТабТекст2, ТабТекст3" с этим полученым ID

Тогда у вас получится что-то типа INSERT INTO MainTable (DATA) VALUES ('дата дата текст текст текст')
22 май 09, 10:31    [7213838]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
А зачем автор один кортеж размазывает по 5 таблицам? Любой JOIN потом, заместо соединения 2 таблиц будет соединять 6...

По поводу единого "айдишника": автор знаком с FOREIGN KEY?

Извините меня если я чего-то не понял...
22 май 09, 10:50    [7213962]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Oleg1313
Member

Откуда:
Сообщений: 16
FOREIGN KEY - да знаком
ты верно понял

У нас база за 5 месяцов вот таких данных, выросла ) на 4 гига и мне начальник нашептал на ушко что если каждое значение хранить в отдельной таблицы, объединяя записи общим ID, то её размер существенно сократиться и еще много всяких плюсов появится, я так и не понял каких ))
В общем не знаю что и делать, и сказать на это нечего.
22 май 09, 18:27    [7217476]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
интересно где был начальник, когда все это проектировалось...

для спящего время бодрствования равносильно сну
22 май 09, 18:32    [7217495]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
выбираете различные значения по текстовой колонке. вставляете их в отдельную таблицу. а потом апдейтите исходную таблицу, где вместо текстового значения подставляете ID шники (через джоин)

для спящего время бодрствования равносильно сну
22 май 09, 18:35    [7217503]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
iljy
Guest
Oleg1313
FOREIGN KEY - да знаком
ты верно понял

У нас база за 5 месяцов вот таких данных, выросла ) на 4 гига и мне начальник нашептал на ушко что если каждое значение хранить в отдельной таблицы, объединяя записи общим ID, то её размер существенно сократиться и еще много всяких плюсов появится, я так и не понял каких ))
В общем не знаю что и делать, и сказать на это нечего.


Фигню сказал этот начальник. С какого перепугу в таком виде данных станет меньше? Простой подсчет показывает:

сейчас на 1 запись - ИД 4 байта + строка N байт.
в его варианте - 5 ИД по 4 байта - 20 байт, + 5 строк, общая длина у них - N, плюс служебные символы, дополняющие пробелы если поля фиксированные и т.п.
Вообще - кто мешает сделать одну таблицу с 6 полями - ИД и ваши даты-тексты? Даты соответственно хранить как datetime - вот и экономия. А на тексте можно съэкономить если у вас значения часто повторяются и на них можно словари составить - тогда вперед и с песней!
А оптимальное решение в любом случае по-моему будет VIEW, и на нее триггер INSTEAD OF INSERT, а там как хотите распихивайте, хоть в 1 таблицу, хоть в 20. И даже если делать в ваши 5- достаточно в первой (ТабДата1) сделать identity, а в остальные вставлять с этим же ИД
CREATE TRIGGER
....
-- Разобрать вставляемую строку на части, @Part1 - @Part5
declare @ID int
insert into ТабДата1 (Data) Values(@Part1)
output @ID

-- дальше вот так:
insert int ТабДата2 (Id, Data) Values(@id, @Part2)
...

22 май 09, 19:05    [7217565]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
iljy
Guest
пардон, первый insert вот так :)
insert into ТабДата1 (Data) Values(@Part1)
set @id= scope_identity()
22 май 09, 19:10    [7217580]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
vino
Member

Откуда:
Сообщений: 1191
Oleg1313
...если каждое значение хранить в отдельной таблицы, объединяя записи общим ID, то её размер существенно сократиться...
Так понятно же, что имелось в виду - перепроектирование:
1) разбейте сначала данные из DATA в какую-нибудь тестовую таблицу на поля - так будет быстрее анализировать.
2) проанализируйте повторяемость значений по каждому полю
3) создайте рабочие справочники (id, value) соответственно каждому полю, в котором высокая повторяемость значений value.
4) добавьте соответствующие поля FK рядом с полем DATA в основную таблицу MainTable
5) создайте триггер на вставку и обновление данных в поле DATA, чтобы в дальнейшем пополнялись справочники и проставлялись ссылки FK и, если будут возможные остатки от поля DATA, то поместите их в новое поле DATA1 (оно будет уже существенно меньше)
6) один раз обновите все связи FK (если нужно, то и DATA1) в таблице MainTable

Вот и вся подготовка. Дальше надо
7) везде где участвует поле DATA - выполнять соединение со справочниками и выуживать оттуда информацию (а также из поля DATA1)
8) переименовать поле DATA в, например, DATA_DEL, чтобы была возможность вернуть его на время, и триггер должен это учесть, продолжая его обновлять

После того, как все будет отлажено и тщательно проверено
9) можете это старое поле удалить (в триггере это учесть), и наслаждаться уменьшением размера таблицы MainTable
22 май 09, 19:16    [7217591]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
Oleg1313
Member

Откуда:
Сообщений: 16
автор
Вообще - кто мешает сделать одну таблицу с 6 полями - ИД и ваши даты-тексты? Даты соответственно хранить как datetime - вот и экономия.


Сейчас именно так и сделано.

автор

А на тексте можно съэкономить если у вас значения часто повторяются и на них можно словари составить - тогда вперед и с песней!


Всё значения уникальны.

В общем строку по сути разбирать не нужно, по сути данные из программы и так уже поступают разбитые, нужно только что бы данные были в разных таблицах и были согласованы.

CREATE TRIGGER
....
-- Разобрать вставляемую строку на части, @Part1 - @Part5
declare @ID int
insert into ТабДата1 (Data) Values(@Part1)
output @ID

-- дальше вот так:
insert int ТабДата2 (Id, Data) Values(@id, @Part2)
...

ага спасиб посмотрю в эту сторону
23 май 09, 11:21    [7218466]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
lepton
Member

Откуда: Протвино
Сообщений: 1261
По сабжу.

Прежде чем клепать тригера, проверьте и оцените на небольшом объеме данных выйгрыш от такой переделки. Делать 2 отдельные таблицы, в которых будет храниться только ID и поле типа Datetime весьма сомнительная процедура.

Вариант от vino требует анализа значений атрибутов в вашей таблице, вся информация у вас "на руках", возьмите и посчитайте.

P.S. exec sp_spaceused в помощь.
23 май 09, 11:49    [7218491]     Ответить | Цитировать Сообщить модератору
 Re: Функция или процедура. Разбивка строки  [new]
vino
Member

Откуда:
Сообщений: 1191
Oleg1313
...Всё значения уникальны.
В общем строку по сути разбирать не нужно, по сути данные из программы и так уже поступают разбитые, нужно только что бы данные были в разных таблицах и были согласованы...
Что значит "все уникальны"? Вы уже провели анализ повторяемости? Поля Вы уже разделили, как я понял - это неплохо для быстродействия при наличии соответствующих индексов, но табличка-то практически уменьшилась? Здесь разве только можно на smalldatettime выиграть.
А просто растаскивать на разные таблицы, как Вы придумали, крайне вредно - iljy правильно предупредил - объем бесполезно увеличиться, так что мои рекомендации остаются те же, и совпадают с
iljy
...сделать одну таблицу с 6 полями - ИД и ваши даты-тексты? Даты соответственно хранить как datetime - вот и экономия. А на тексте можно съэкономить если у вас значения часто повторяются и на них можно словари составить - тогда вперед и с песней!
25 май 09, 11:24    [7221768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить