2015-10-06 228 views
-3

我有值的表如下逗號分隔字符串表

StudentID | Name | Subscribed Subject | 
101  |John | Maths, Bio, Zoo | 
102  |Mary | Bio, Zoo   | 

我想要檢索的信息如下

StudentID | Name | Subscribed Subject | 
101  |John | Maths    | 
101  |John | Bio    | 
101  |John | Zoo    | 
102  |Mary | Bio    | 
102  |Mary | Zoo    | 

有人能幫我嗎?不使用遊標。

+0

你能具體習俗? – Andrew

+0

什麼是您使用的數據庫? –

+0

我使用SQL Server 2008. – vaduganathan

回答

0

試試這個代碼

 SET @STRSQL = 'SELECT ''' + REPLACE(Subscribed_Subject, ',', 
               ''' ,''') + '''' 

      DECLARE @tbl TABLE 
       (
        col1 VARCHAR(100) 

       ) 

插入您的數據,臨時表,然後嘗試從臨時選擇。

  INSERT INTO @tbl 
        EXECUTE (@STRSQL 
          ) 
0

您可以通過以下查詢來實現功能。

SELECT A.[StudentID], 
    Split.a.value('.', 'VARCHAR(100)') AS String 
FROM (SELECT [StudentID], 
     CAST ('<M>' + REPLACE(Subscribed, ',', '</M><M>') + '</M>' AS XML) AS String 
     FROM Student) AS A CROSS APPLY String.nodes ('/M') AS Split(a); 

爲了您的快速參考,我包括SQL小提琴。

SQLFiddle

1

試試這個

Fiddle Demo

Create FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20)) 
RETURNS @Strings TABLE 
( 
    position int IDENTITY PRIMARY KEY, 
    value varchar(8000) 
) 
AS 
BEGIN 

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
    BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
     BEGIN 
     INSERT INTO @Strings VALUES (@text) 
      BREAK 
     END 
    IF (@index > 1) 
     BEGIN 
     INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
     END 
    ELSE 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END 
    RETURN 
END 


select t.StudentID,t.Name ,test.value 
from tablename t cross apply fn_Split(t.SubscribedSubject,',') as test