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

Откуда:
Сообщений: 8
Нужна помощь.
У меня есть запись в таблице и в некоторых полях данные записаны через делиметер '\n'.
Мне нужно записать в другую таблицу так чтобы получить например три записи если было в поле три елемента через делиметр. Если скажем в одном поле было 3 елемента а в другом 4 то записей должно быть 4 с пустым значением там где три :

field1 | field2 | field3 | data1'\n'data2'\n'data3'\n' |data11'\n'data22'\n'data33'\n'data44 |field4

Result:

field1 | field2 | field3 | data1 | data11 |field4
field1 | field2 | field3 | data2 | data22 |field4
field1 | field2 | field3 | data3 | data33 |field4
field1 | field2 | field3 | null | data44 |field4

вот такая грустная история. уже мозги сломал а очень надо.
Спасибо за участие
27 июн 09, 05:46    [7350981]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
на C# ничего сложного, тем более что задача скорей всего одноразовая.
27 июн 09, 17:32    [7351382]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
на T-SQL мозг сломаете
27 июн 09, 17:33    [7351383]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
CmeTanka
на C# ничего сложного, тем более что задача скорей всего одноразовая.
Ну прямо сразу C#, без него - никуда
На T-SQL можно сделать через курсоры.
27 июн 09, 17:34    [7351385]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
CmeTanka
Member [заблокирован]

Откуда: Рашен Федерэйшен
Сообщений: 2272
Senya_L
CmeTanka
на C# ничего сложного, тем более что задача скорей всего одноразовая.
Ну прямо сразу C#, без него - никуда
На T-SQL можно сделать через курсоры.

и в чём сущ разница будет? на c# быстрее закодить получится.
27 июн 09, 17:35    [7351387]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
CmeTanka
и в чём сущ разница будет? на c# быстрее закодить получится.
У Вас под рукой есть VisualStudio? У меня - нет.
Тем паче, что если нет разницы, то зачем мне устанавливать C# ради разовой задачи?
27 июн 09, 17:40    [7351391]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Senya_L,

csc всегда под рукой.
хотя отлаживатся - не сахар.
27 июн 09, 18:05    [7351421]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Alex Shmidt,

Версию сервера не указали, тестовый пример не сделали...
Предполагая что версия 2005 и выше, используя алгоритмы от iap - SQL2005: популярные задачи форума и CTE
делаем вот это (для каждого поля которое необходимо распарсить)
IF OBJECT_ID('T') IS NOT NULL DROP TABLE T;
GO
CREATE TABLE T(ID INT NOT NULL IDENTITY, S VARCHAR(MAX) not null);
GO
/*Заполнение тестовой таблицы*/
DECLARE @I INT;
SET @I=0;
WHILE @I<10
BEGIN
 INSERT T(S) SELECT '1tt'+CAST(IDENT_CURRENT('T')AS VARCHAR(100)) +'''/n'''+
					'2222tt'+CAST(IDENT_CURRENT('T')AS VARCHAR(100)) +'''/n'''+
					'3tt'+CAST(IDENT_CURRENT('T')AS VARCHAR(100)) ;
 SET @I=@I+1;
END;
/* собственно само распарсивание*/

DECLARE @S VARCHAR(100);
SET @S='''/n''';
WITH CTE(ID,Q,S) AS
(
 SELECT ID, 0, S FROM T
 UNION ALL
 SELECT ID, Q+1, STUFF(S,1, PATINDEX('%'+@S+'%',S)+3,'') FROM CTE WHERE PATINDEX('%'+@S+'%',S)>0
)
select  id, case when charindex(@S,S) = 0
			then s
			else substring(s,1,charindex(@S,S)-1)
		end 
from CTE 
ORDER BY ID,Q
OPTION (MAXRECURSION 0);

GO
DROP TABLE T;
после чего сливаем полученные распарсенные таблички в одну и джойним к главной
iap прийдет - что-нибудь покрасивше посоветует :)
27 июн 09, 19:51    [7351547]     Ответить | Цитировать Сообщить модератору
 Re: Трудный вопрос  [new]
Alex Shmidt
Member

Откуда:
Сообщений: 8
Спасибо всем откликнувшимся.
На шарпе уже есть, Я использовал LINQ хотя конечно можно было и по старинке.

особое спасибо Taffy,
Да версия 2005 примера нету потому как чуть голову не сломал и ничего не смог выдавить
Я новичек в Т-SQL.

Вобщем спасибо всем, ща буду пробывать.
27 июн 09, 22:55    [7351721]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить