SQL select: разбиение поля на несколько строк с токенами char (13) - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть запрос как:

SELECT 'Item' AS TypeID, 
    iORCompID AS iEntityID,
    iORCompID AS iParentEntityID,
    '' as Source,
    vComments as Comment
FROM 
    OrderResultComponents
WHERE IOrderID = @IEntityID 

Данные, которые я получаю, следующие

TypeID  |   iEntityID   |   iParentEntityID     |   Source  |   Comment
Item    |   1045        |   1045                |           |   Item Found  some pending comments \X000d\ by UserID1
Item    |   1027        |   1027                |           |   Item Found  with some pending comments \X000d\ by UserID2
Item    |   5389        |   5389                |           |   Item Found  with \X000d\ some \X000d\ pending comments \X000d\ by UserID1

(\ X000d \ is Char (13), я думаю)

Однако я хочу, чтобы данные были такими:

TypeID  |   iEntityID   |   iParentEntityID     |   Source  |   Comment
Item    |   1045        |   1045                |           |   Item Found  some pending comments
Item    |   1045        |   1045                |           |   by UserID1
Item    |   1027        |   1027                |           |   Item Found  with some pending comments 
Item    |   1027        |   1027                |           |   by UserID2
Item    |   5389        |   5389                |           |   Item Found  with 
Item    |   5389        |   5389                |           |   some
Item    |   5389        |   5389                |           |   pending comments 
Item    |   5389        |   5389                |           |   by UserID1

т.е. Я хочу разделить поле «Комментарий» следующим символом строки DB и повторить другие поля с этим разделением ... Любая помощь ???

EDIT: Ах, Я получил подсказку от Разделить один столбец на несколько строк

Пожалуйста, исправьте мой запрос, если он недействителен.

SELECT     
'Item' AS TypeID, '' as SetID,T.iORCompID , RIGHT(LEFT(T.vComments,Number-1),    
CHARINDEX(char(13),REVERSE(LEFT(char(13)+T.vComments,Number-1)))) 
FROM     master..spt_values,     OrderResultComponents T 
WHERE     Type = 'P' 
AND Number BETWEEN 1 
AND LEN(T.vComments)+1    
AND (SUBSTRING(T.vComments,Number,1) = char(13) ) AND T.IOrderID = @iEntityID

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011
declare @index int;
declare @TypeID varchar(10),@left varchar(max);
declare @iEntityID int,@iParentEntityID int;
declare @Source varchar(max),@Comment varchar(max);

declare split_cursor cursor for 
select * from OrderResultComponents
open split_cursor
fetch next from split_cursor into @TypeID,@iEntityID,@iParentEntityID,@Source,@Comment
while (@@fetch_status=0)
begin
    set @index=charindex('\X000d',@Comment);
    while(@index!=0)
        begin
            set @left=substring(@Comment,1,@index-1);
            set @Comment=substring(@Comment,@index+8,len(@Comment));
            insert into #split values (@TypeID,@iEntityID,@iParentEntityID,@Source,@left);
            set @index=charindex('\X000d',@Comment);
        end
        insert into #split values (@TypeID,@iEntityID,@iParentEntityID,@Source,@Comment);
    fetch next from split_cursor into @TypeID,@iEntityID,@iParentEntityID,@Source,@Comment
end
select * from OrderResultComponents;
select * from #split;
close split_cursor
deallocate split_cursor
truncate table #split
0 голосов
/ 18 ноября 2011

Не зная каких-либо особенностей вашего приложения, вам нужно будет сделать что-то вроде этого:

  • Запросите базу данных с вашим первоначальным запросом и сохраните ее в DataTable
  • Перебирайте строки в DataTable и объединяйте ваши данные с StringBuilder
  • Записать содержимое StringBuilder в текстовый файл

Проверьте эту ветку StackOverflow для получения информации о том, как создавать и записывать в текстовый файл.

Пожалуйста, добавьте комментарий, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...