2014-02-20 4 views
0

Я таблица ABC, содержащая следующие данные:SQL Отдельные строки

ID Data 
1 text|text|text 
2 text|text|text 

Что такое запрос таким образом я получаю следующий результат?

ID Data 
1 text 
1 text 
1 text 
2 text 
2 text 
2 text 

Может ли это быть Code правильный путь? Как использовать его, чтобы получить идентификаторы для записей данных?

+0

Проверить этот пост: http://stackoverflow.com/questions/2647/split-string-in-sql – alan

+0

Я бы принести результат и сделать часть разделения в коде (если у вас есть программа) –

ответ

2

Upto SQL Server 2008 R2 Я думаю, что у нас нет лучшего варианта, кроме этого, но в SQL Server 2012 с добавленной дополнительной функцией это может быть возможно.

DECLARE @tblTemp TABLE 
(
ID INT 
, TextValue NVARCHAR(500) 
) 

INSERT INTO @tblTemp 
SELECT 1, 'text|text|text' 
UNION 
SELECT 2, 'text|text|text' 

SELECT * FROM @tblTemp 

DECLARE 
@ID INT, 
@Data NVARCHAR(MAX), 
@Expression NVARCHAR(5); 

DECLARE @Temp TABLE 
(
ID INT, 
Data NVARCHAR(100) 
) 


DECLARE TempCursor CURSOR FORWARD_ONLY STATIC FOR 
SELECT ID, TextValue, '|' FROM @tblTemp 

-- Open cursor and try to fetch first element 
OPEN TempCursor 
FETCH NEXT FROM TempCursor INTO @ID, @Data, @Expression 

-- loop while fetch returned next item 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    -- Do the processing 
    DECLARE @Index INT 
    SET @Index = 1 

    WHILE (CHARINDEX(@Expression, @Data) > 0) 
    BEGIN 
     INSERT INTO @Temp(ID, data) 
     SELECT @ID, Data = LTRIM(RTRIM(SUBSTRING(@Data, 1, CHARINDEX(@Expression, @Data)-1))) 

     SET @Data = SUBSTRING(@Data, CHARINDEX(@Expression, @Data) + 1, LEN(@Data)) 
     SET @Index = @Index + 1 
    END 

    INSERT INTO @Temp (ID, Data) 
    SELECT @ID, Data = LTRIM(RTRIM(@Data)) 

    -- fetch next entry 
    FETCH NEXT FROM TempCursor INTO @ID, @Data, @Expression 
END 

-- Close and deallocate cursor 
CLOSE TempCursor 
DEALLOCATE TempCursor 

SELECT DISTINCT * FROM @Temp 
0

Дорогой друг создать функцию SQL, а затем вызвать его

CreateFUNCTION [dbo].[SplitTest](@String varchar(MAX), @Delimiter char(1))  
as 
begin 
declare @idx int  
declare @slice varchar(8000)  

select @idx = 1  
    if len(@String)<1 or @String is null return  

while @idx!= 0  
begin  
    set @idx = charindex(@Delimiter,@String)  
    if @idx!=0  
     set @slice = left(@String,@idx - 1)  
    else  
     set @slice = @String  

    if(len(@slice)>0) 
     insert into @temptable(Items) values(@slice)  

    set @String = right(@String,len(@String) - @idx)  
    if len(@String) = 0 break  
end 
return 
end; 

Select ID, SplitTest(Data,'|') From YourTable 

 Смежные вопросы

  • Нет связанных вопросов^_^