2014-02-20 28 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是正確的方法嗎?如何使用它,以便獲取數據記錄的ID?

+0

退房這個帖子:http://stackoverflow.com/questions/2647/split-string-in-sql – alan

+0

我會取結果並在代碼中進行拆分(如果有程序) –

回答

2

高達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