2014-04-01 179 views
1

我有一個場景,我必須將逗號分隔值轉換爲列。將逗號分隔值轉換爲行

實際:

ID NAME Col1  Col2 
1 A AB,BC,CD  
2 B    XY,YZ 
3 C DE,FE 

預計:

ID NAME Col1  Col2 
1 A  AB 
1 A  BC 
1 A  CD 
2 B     XY 
2 B     YZ 
3 C  DE 
3 C  EF 

下面是查詢

SELECT a.ID, 
     a.Name, 
     b.splitdata , 
     c.splitdata 
FROM dbo.TABLE1 a CROSS APPLY dbo.fnSplitString(a.COL1,',') AS b 
CROSS APPLY dbo.fnSplitString(a.COL2,',') AS c 

我得到結果爲零。請讓我知道是否有人可以幫助我。

下面是分割功能

ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0  
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata)  
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 
+4

請花一些時間格式化您的問題。 –

+3

我試圖清理你發佈的**巨大**亂碼 - 但是很抱歉,我真的**不知道第一部分應該是什麼樣子。請下一次 - 如果您要求我們花時間閱讀並回答您的問題,**至少**花一點時間以可讀和清晰的格式發佈問題! –

+0

感謝Marc_s的成功。當我嘗試發佈問題時,我不能像上面那樣發佈問題。我得到了一個格式化問題 – user3485295

回答

0

最有可能你的函數不處理空值。

SELECT a.ID, 
      a.Name, 
      b.splitdata , 
      c.splitdata 
    FROM dbo.TABLE1 a 
    CROSS APPLY dbo.fnSplitString(isnull(a.COL1,'')',') AS b 
    CROSS APPLY dbo.fnSplitString(isnull(a.COL2,''),',') AS c 
+0

如果此答案對您有用,請接受/ upvote,以便其他人可以從中受益。 – dean

+0

您在第一個fnSplitString函數中缺少a:所以它應該看起來像第二個dbo.fnSplitString(isnull(a.COL1,''),',') – Nebi